home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-Sensation: Golden Games / Amiga CD-Sensation - Ausgabe 2 - Golden Games (1996)(GTI - Schatztruhe)(DE)[!].iso / Various / Rocky / Rocky.s < prev    next >
Text File  |  1992-03-22  |  66KB  |  3,188 lines

  1. *************************************************************************
  2. *                                    *
  3. *    'Rocky Clone' by Laurence Vanhelsuwé        © 1992        *
  4. *                                    *
  5. *************************************************************************
  6.  
  7.         INCLUDE    std
  8.         INCLUDE    b.macros    ;2-d cell access macros
  9.  
  10. *************************************************************************
  11.  
  12. *---------------------------------------
  13. * ALL STRUCTURES MUST BE EVEN SIZED !!!! : (check BYTE sized tails only) 
  14. *---------------------------------------
  15.  RSRESET    ;MEMORY structure
  16. mem_type        RS.L    1    ;CHIP,PUBLIC or FAST
  17. mem_size        RS.L    1    ;# of bytes to allocate
  18. mem_ptr            RS.L    1    ;ptr to LONG to hold address
  19. MEMORY_sizeof        rs.b    0
  20.  
  21.  RSRESET    ;FILE structure
  22. name_ptr        RS.L    1    ;ptr to C-string
  23. buf_ptr            RS.L    1
  24. buf_size        RS.L    1
  25. FILE_sizeof        rs.b    0
  26.  
  27.  RSRESET    ;WORLD structure
  28. jewel_value        RS.L    4    ;how much a standard gem scores
  29. greedy_value        RS.L    4    ;how much a gem scores BEYOND required number
  30. to_collect        RS.W    4    ;number of gems to collect
  31. time_lefts        RS.W    4    ;seconds to solve this level in
  32. WORLD_sizeof        rs.b    0
  33.  
  34.  RSRESET    ;SNAKE structure
  35. SNK_segm_ptrs        RS.L    8    ;8 ptrs to the 8 snake segments in game map
  36. SNK_reversebuf1        RS.L    8
  37. SNK_head_index        RS.W    1
  38. SNK_dir_codes        RS.B    8    ;0..3 U,R,D,L
  39. SNK_reversebuf2        RS.B    8
  40. SNK_head_codes        RS.B    4    
  41. SNK_segm_codes        RS.B    4
  42. SNK_tail_codes        RS.B    4
  43. SNK_turn_rocks_into    RS.B    1    ;ROCKS into DIAMS or FFLIES
  44. SNK_length        RS.B    1    ;1..8
  45. SNK_hatched        RS.B    1    ;has this snake hatched out of his egg yet?
  46. pad_00            RS.B    1
  47. SNAKE_sizeof        rs.b    0
  48.  
  49. FIRE_BUTTONS        equ    $BFE001
  50. FIRE2            equ    7
  51. FIRE1            equ    6
  52. STICK2            equ    1
  53. joy0dat            equ    $00A
  54. vposr            equ    $004    ;used in random number generator !
  55.  
  56. ;************************************************************************
  57.  
  58. ;----------------------- INTUITION CONSTANTS
  59. ; IDCMP flags
  60. ;------------
  61. WINDOW_IDCMP        equ    VANILLAKEY    ;would like pure ASCII please...
  62.  
  63. *WINDOW_IDCMP        equ    CLOSEWINDOW+MOUSEBUTTONS+RAWKEY+GADGETUP
  64.  
  65. WINDOW_FLAGS        equ    ACTIVATE+BACKDROP+BORDERLESS
  66.  
  67. ************************************************************************
  68. ** Game specific equates
  69. ************************************************************************
  70.  
  71. * The dimensions of the game area (in cells)
  72.  
  73. COLUMNS            equ    40
  74. ROWS            equ    22
  75. MAP_SIZE        equ    ROWS*COLUMNS
  76.  
  77. SCREEN_WIDTH        equ    40
  78.  
  79. ;----------------------- LIFE FORMS IN ROCKY
  80. AIR            equ    $00
  81. GRASS            equ    $01
  82. RWALL            equ    $02    ;rock wall : indestructible
  83. WALL            equ    $03
  84. EWALL            equ    $04    ;04,05,06,07
  85. GWALL            equ    $08
  86.  
  87. FWALL            equ    $0C    ;0C,0D,0E,0F
  88. AMIBA            equ    $10    ;10,11,12,13
  89.  
  90. MAN            equ    $20    
  91. WMAN            equ    $24    ;waiting man
  92. ROCK            equ    $28    ;28
  93.  
  94. FROCK            equ    $2C    ;2C,2D,2E,2F    ;falling (killer) rock
  95. BUTTER_FLY        equ    $30    ;ANIMATING,ANTI-CLOCK WISE
  96. BUTFLY_U        equ    $30    ;bat,pirhanas,birds 
  97. BUTFLY_R        equ    $31
  98. BUTFLY_D        equ    $32
  99. BUTFLY_L        equ    $33
  100. FIRE_FLY        equ    $34    ;ROTATING,CLOCK WISE MOVEMENT
  101. FIREFLY_U        equ    $34    ;monkeys,fish
  102. FIREFLY_R        equ    $35
  103. FIREFLY_D        equ    $36
  104. FIREFLY_L        equ    $37
  105. FIRE_TAP        equ    $38    ;38,39,3A,3B
  106.  
  107. EXPL_BFLY_DIAM        equ    $40    ;40,41,42,43
  108. EXPL_ROCK_FFLY        equ    $44    ;44,45,46,47
  109. EXPL_FFLY_AIR        equ    $48    ;48,49,4A,4B
  110. EXPL_AIR        equ    $4C    ;4C,4D
  111. EXPL_AMIB_DIAM        equ    $4E    ;4E,4F
  112. EXPL_AMIB_ROCK        equ    $50    ;50,51
  113. EXPL_DIAM_BFLY        equ    $54    ;54,55,56,57
  114.  
  115. DROPLETS        equ    $60    ;for all drops and fires
  116. FALLING_DROP        equ    $60    ;60,61
  117. FLAME            equ    $68    ;68,69
  118. HR_DROP            equ    $62    ;62,63
  119. HL_DROP            equ    $64    ;64,65
  120. EXPL_DROP        equ    $66    ;66,67
  121. HR_FLAME        equ    $6A    ;6A,6B
  122. HL_FLAME        equ    $6C    ;6C,6D
  123.  
  124. BEGG            equ    $70    ;70,71,72,73
  125. EXIT            equ    $74    ;74,75,76,77
  126. NUMBER            equ    $78    ;78,79,7A,7B
  127. EXTRA_T            equ    $7C    ;7C,7D,7E,7F
  128. EXTRA_L            equ    $80    ;80,81,82,83
  129. GEGG            equ    $84    ;84,85,86,87
  130. DIAMOND            equ    $88
  131.  
  132. FDIAMOND        equ    $8C
  133.  
  134. GSNAKE            equ    $90
  135. GS_HEAD            equ    $90    ;90,91,92,93,94,95,96,97 UU/RR/DD/LL
  136. GS_SEGM            equ    $98    ;98,99,9A,9B,9C,9D,9E,9F
  137. GS_TAIL            equ    $A0    ;A0,A1,A2,A3,A4,A5,A6,A7
  138.  
  139. WATER_TAP        equ    $C4    ;C4,C5,C6,C7
  140.  
  141. BSNAKE            equ    $D0
  142. BS_HEAD            equ    $D0    ;D0,D1,D2,D3,D4,D5,D6,D7 UU/RR/DD/LL
  143. BS_SEGM            equ    $D8    ;D8,D9,DA,DB,DC,DD,DE,DF
  144. BS_TAIL            equ    $E0    ;E0,E1,E2,E3,E4,E5,E6,E7
  145.  
  146. ;----------------------- GAME SETTINGS
  147. PUSH            equ    4    ;range 1..1+PUSH
  148. AFTER_LIFE        equ    10    ;generations between fade after rf death
  149. MAGIC_TIME        equ    350    ;N generations of EWALL
  150. G_HATCH_TIME        equ    100    ;generations before egg hatches
  151. B_HATCH_TIME        equ    200
  152. BONUS_SECS        equ    20    ;seconds added
  153. BONUS_CHANCE        equ    20    ; % to get bonus life when completed level
  154. BSNAKE_BADNESS        equ    10    ; % to get a fire fly out of a rock
  155. DROP_NERVES        equ    40    ; % for stuck drop to explode
  156. DROPS_SPEED        equ    3    ;has to be a 2^n -1
  157.  
  158. FLASH_TIME        equ    5
  159. REPEAT_MOVIE        equ    3
  160. AMIBA_SPEED        equ    70    ;smaller is quicker (max 127)
  161. TRIGGERX        equ    32
  162. TRIGGERY        equ    20
  163. *-----------------------
  164. PLANES            equ    3
  165. *-----------------------
  166.  
  167. PAUSE            equ    ' '    ;press SPACE to pause game
  168. SUICIDE            equ    CR    ;press RETURN to commit suicide
  169. QUIT            equ    ESC    ;press ESCAPE to quit game
  170.  
  171. CRSRU            equ    'w'    ;press "w" to move up
  172. CRSRD            equ    's'    ;press "s" to move down
  173. CRSRR            equ    'p'    ;press "p" to move right
  174. CRSRL            equ    'o'    ;press "o" to move left
  175.  
  176. *-----------------------BIT NAMES
  177.  
  178. RIGHT            equ    0    ;returned bit numbers from read_stick
  179. LEFT            equ    1
  180. UP            equ    2
  181. DOWN            equ    3
  182. FIRE            equ    4
  183.  
  184. MASK1            equ    -1    ;$FFFFF
  185. MASK2            equ    -2    ;$FFFFE
  186. MASK4            equ    -4    ;$FFFFC
  187. MASK8            equ    -8    ;$FFFF8
  188. MASK16            equ    -16    ;$FFFF0
  189. MASK32            equ    -32    ;$FFFE0
  190. BFLY_MASK        equ    $7C    ;%0111 1100
  191. FFLY_MASK        equ    $74    ;%0111 0100
  192.  
  193. ************************************************************************
  194. ************************************************************************
  195. ***********************                 ********************************
  196. *********************** PROGRAM SECTION ********************************
  197. ***********************                 ********************************
  198. ************************************************************************
  199. ************************************************************************
  200.  
  201. START_PROGRAM    move.l    sp,stack_level        ;remember stack pointer for bail outs
  202.  
  203.         bsr    open_libraries        ;open Amiga libraries
  204.         bsr    open_screen        ;open game screen
  205.         bsr    get_n_load_most        ;allocate buffers & load files
  206.         bsr    init_divu_table
  207.         move.w    #0,level
  208.  
  209. ;---------------
  210. next_map    bsr    load_level        ;copy R/O level into working map
  211.         bsr    new_game        ;initialize game
  212.  
  213.         bsr    play_level        ;play level until solved
  214.         bra    next_map
  215. ;---------------
  216. quit_game    move.l    stack_level,sp        ;restore stack pointer
  217.  
  218.         bsr    close_screen        ;kill our game Screen
  219.         bsr    ret_mem_blocks        ;return allocated memory to pool
  220.         bsr    close_libraries        ;release previously opened libraries
  221.  
  222.         moveq    #0,d0            ;clean CLI return code
  223.  
  224. END_PROGRAM    rts
  225.  
  226. ************************************************************************
  227. ************************************************************************
  228. ***********************                 ********************************
  229. ***********************   END OF MAIN   ********************************
  230. ***********************                 ********************************
  231. ************************************************************************
  232. ************************************************************************
  233.  
  234. ;-------------------------------------------------------
  235. play_level    
  236.  
  237. game_loop    bsr    tune_game_speed        ;depending on which 680x0 this is...
  238.  
  239.         bsr    test_IDCMP        ;check Intuition events (keypresses)
  240.         bsr    get_key
  241.         
  242.         sf    key_move        ;assume move made with keys (not joyst)
  243.         cmp.b    #CRSRU,d0
  244.         bne    not_crsru
  245.         bset    #UP,key_move        ;simulate joystick input
  246.  
  247. not_crsru    cmp.b    #CRSRD,d0
  248.         bne    not_crsrd
  249.         bset    #DOWN,key_move        ;simulate joystick input
  250.  
  251. not_crsrd    cmp.b    #CRSRL,d0
  252.         bne    not_crsrl
  253.         bset    #LEFT,key_move        ;simulate joystick input
  254.  
  255. not_crsrl    cmp.b    #CRSRR,d0
  256.         bne    not_next
  257.         bset    #RIGHT,key_move        ;simulate joystick input
  258.         
  259. ;        cmp.b    #'n',d0            ;CHEAT key ?
  260. ;        bne    not_next
  261. ;        st    found_exit
  262.  
  263. not_next    cmp.b    #PAUSE,d0        ;PAUSE key
  264.         bne    not_spc
  265.         not.b    pauze
  266.         bra    done_keys
  267.  
  268. not_spc        cmp.b    #SUICIDE,d0        ;SUICIDE key
  269.         bne    not_esc
  270.         st    die_anyway
  271.         bra    done_keys
  272.  
  273. not_esc        cmp.b    #QUIT,d0        ;QUIT game key
  274.         beq    quit_game
  275.  
  276. done_keys    tst.b    pauze
  277.         bne    game_loop
  278.  
  279.         bsr    redraw_screen        ;display generation
  280.         bsr    get_user_move        ;check joystick/keyboard
  281.         bsr    anim_map        ;calc next generation
  282.         bsr    update_panel        ;score,diamonds,time
  283.         bsr    track_time        ;keep track of seconds
  284.     
  285. dont_stop    move.b    out_of_time,d0
  286.         or.b    rockf_died,d0
  287.         move.b    found_exit,d1
  288.         or.b    d0,d1
  289.         beq    game_loop
  290. ;- - - -
  291.         st    disable_rockf
  292.         subq.b    #1,death_count
  293.         bne    game_loop
  294.  
  295.         tst.b    d0
  296.         beq    quit_level
  297.         subq.w    #1,lives
  298.  
  299. quit_level    lea    bonus_scores,a0
  300.         move.w    next_bonus,d0
  301.         add.w    d0,d0
  302.         add.w    d0,d0
  303.         move.l    score,d1
  304.         cmp.l    0(a0,d0),d1
  305.         bcs.s    not_crossed
  306.         addq.w    #1,next_bonus
  307.         addq.w    #1,lives
  308.         
  309. not_crossed    tst.b    found_exit
  310.         beq    no_time_bonus
  311.         move.l    #200000,d0
  312.         bsr    delay
  313.         bsr    add_secs_left
  314.         move.l    #200000,d0
  315.         bsr    delay
  316.  
  317. no_time_bonus    tst.b    found_exit
  318.         bne    next_level
  319.         tst.w    lives
  320.         bpl    play_level
  321.         moveq    #0,d0
  322.         rts
  323.  
  324. next_level    addq.w    #1,level
  325.         cmp.w    #40,level
  326.         beq    quit_game
  327.         rts
  328. ;-------------------------------------------------------
  329. get_n_load_most    lea    alloc_params,a5
  330.  
  331. ;-------------------------------------------------------
  332. ; A5 -> alloc & load blocks
  333.  
  334. get_things    move.l    4.w,a6
  335.         move.w    (a5)+,d7
  336. alloc_block    move.l    mem_type(a5),d1        ;type
  337.         move.l    mem_size(a5),d0        ;size
  338.         EXEC    AllocMem
  339.         move.l    mem_ptr(a5),a0
  340.         move.l    d0,(a0)
  341.         add.w    #MEMORY_sizeof,a5    ;next allocation entry
  342.         dbeq    d7,alloc_block
  343.         beq    HANG
  344.  
  345.         move.l    DOS_LIB_PTR,a6
  346.         move.w    (a5)+,d7
  347. load_file    move.l    (a5)+,d1
  348.         move.l    #MODE_OLDFILE,d2
  349.         DOS    Open
  350.         move.l    d0,d1            ;file handle
  351.         beq    DOS_PROBLEM
  352.         move.l    d0,d6
  353.         move.l    (a5)+,a0
  354.         move.l    (a0),d2
  355.         move.l    (a5)+,d3
  356.         DOS    Read
  357.         move.l    d6,d1
  358.         DOS    Close
  359.         dbra    d7,load_file
  360.         rts
  361. ;---------------------------------------
  362. DOS_PROBLEM    move.w    #WHITE,COLOR_BASE
  363.         move.w    #BLACK,COLOR_BASE
  364.         jmp    DOS_PROBLEM
  365. ;---------------------------------------
  366. ret_mem_blocks    move.l    4.w,a6
  367.         lea    alloc_params,a5
  368.         move.w    (a5)+,d7
  369. free_block    tst.l    (a5)+            ;skip memory type
  370.         move.l    (a5)+,d0        ;get size
  371.         move.l    (a5)+,a1        ;get addr of mem ptr
  372.         move.l    (a1),a1            ;get mem ptr
  373.         EXEC    FreeMem
  374.         dbra    d7,free_block
  375.         rts
  376. ;---------------------------------------
  377. alloc_params    dc.w    ((load_params-al_params)/MEMORY_sizeof)-1
  378. al_params    dc.l    MEMF_PUBLIC,MAP_SIZE,maps
  379.         dc.l    MEMF_PUBLIC,PLANES*8000,char_graphics
  380.         dc.l    MEMF_PUBLIC,256*4,divu_table
  381.  
  382. load_params    dc.w    ((ld_parms_2-ld_parms_1)/FILE_sizeof)-1
  383. ld_parms_1    dc.l    fname0,char_graphics,PLANES*8000
  384. ld_parms_2
  385. ;---------------------------------------
  386. load_level    move.w    level,d2
  387.         mulu    #MAP_SIZE,d2
  388.         lea    source_maps,a0
  389.         add.l    d2,a0
  390.         move.l    maps,a1
  391.         move.w    #MAP_SIZE/2-1,d0
  392. download    move.w    (a0)+,(a1)+
  393.         dbra    d0,download
  394.         rts
  395. ;---------------------------------------
  396. reset_flags    lea    flag_map,a0        ;reset 'done' map
  397.         move.w    #MAP_SIZE/4-1,d0
  398.         moveq    #0,d1
  399. reset_map    move.l    d1,(a0)+
  400.         dbra    d0,reset_map
  401.         rts
  402. ;---------------------------------------
  403. get_user_move    move.b    key_move,d0    ;did player use keyboard for a move ?
  404.         beq    check_joystick
  405.         move.b    d0,joystick+1    ;yes, use this move instead of joystick.
  406.         rts
  407.  
  408. check_joystick    moveq    #STICK2,d0    ;read player decisions in same
  409.         bsr    read_stick    ;place to avoid timing problems
  410.         move.w    d0,joystick
  411.         rts
  412. ;---------------------------------------
  413.  
  414. ************************************************************************************
  415. * Bring entire game map to life by scanning all cells and executing their state
  416. * handler.
  417. * Also handle game elements which need extra procedures (above state mechanism):
  418. * - The snakes     (connected cells are too hard to do with cellular automaton)
  419. * - The Amoeba    (keep track of its size and mutate cells to rocks when big enough)
  420. * - Diamond counting, opening of EXIT
  421. * - Magic wall timeouts
  422. * - Animate Rockford randomly
  423. ************************************************************************************
  424.  
  425. anim_map    sf    added_amiba
  426.         sf    bonk
  427.         sf    ping
  428.         st    rockf_died
  429.  
  430.         bsr.s    reset_flags
  431.  
  432.         move.w    #MAP_SIZE,scan_count    ;process ALL cells ...
  433.         lea    cell_map,a1
  434.         lea    flag_map,a2
  435. ;- - - - - - - - - - - - - - - - - - - -
  436. scan_map    tst.b    (a2)        ;is cell already part of new generation ?
  437.         bne    done_cel    ;no,
  438.  
  439.         moveq    #0,d0
  440.         move.b    (a1),d0        ;curr. cell # in D0
  441.         move.w    d0,d1
  442.         add.w    d1,d1        ;use as index into state routines
  443.         add.w    d1,d1
  444.         movem.l    a1/a2,-(SP)
  445.  
  446.         lea    funcs,a0
  447.         move.l    0(a0,d1.w),d1
  448.         beq    no_call
  449.  
  450.         move.l    d1,a0
  451.         lea    no_call,a6    ;RTS address cached !!!
  452.  
  453.         JMP    (a0)        ;EXECUTE CELL STATE HANDLER
  454.  
  455. no_call        movem.l    (SP)+,a1/a2
  456.         st    (a2)
  457.  
  458. done_cel    addq.w    #1,a1
  459.         addq.w    #1,a2
  460.         subq.w    #1,scan_count
  461.         bne    scan_map
  462. ;- - - - - - - - - - - - - - - - - - - - -
  463.         tst.b    good_snake
  464.         beq    no_good_snake
  465.         lea    gsnake_struct,a0
  466.         bsr    handle_snake
  467.  
  468. no_good_snake    tst.b    bad_snake
  469.         beq    no_snakes
  470.         lea    bsnake_struct,a0
  471.         bsr    handle_snake
  472.  
  473. no_snakes    bsr    handle_amiba    ;change to DIAM,ROCK
  474.         bsr    handle_diams    ;change price if enough
  475.         bsr    handle_ewall    ;change to WALL after magic
  476.         bsr    animate_things    ;animate man
  477.  
  478.         tst.b    bonk
  479.         beq    no_bonk
  480.  
  481.     NOP
  482.  
  483. no_bonk        tst.b    ping
  484.         beq    no_bonk2
  485.  
  486.     NOP
  487.  
  488. no_bonk2    rts
  489. ;---------------------------------------
  490. funcs        dc.l    0    AIR    0    CODES 00..0F ARE RESERVED
  491.         dc.l    0    GRASS    1    FOR PERSPECTIVE CELLS !!!
  492.         dc.l    0    RWALL    2
  493.         dc.l    0    WALL    3
  494.  
  495.         dc.l    ewall    EWALL    4
  496.         dc.l    ewall        5
  497.         dc.l    ewall        6
  498.         dc.l    ewall        7
  499.  
  500.         dc.l    gwall    GWALL    8
  501.         dc.l    0        9
  502.         dc.l    0        A
  503.         dc.l    0        B
  504.  
  505.         dc.l    fwall    FWALL    C
  506.         dc.l    fwall        D
  507.         dc.l    fwall        E
  508.         dc.l    fwall        F
  509.  
  510.         dc.l    amiba    AMIBA    10    ;AND MASK4 = AMIBA
  511.         dc.l    amiba    ''    11
  512.         dc.l    amiba    ''    12
  513.         dc.l    amiba    ''    13
  514.  
  515.         dc.l    0        14
  516.         dc.l    0
  517.         dc.l    0
  518.         dc.l    0
  519.  
  520.         dc.l    0        18
  521.         dc.l    0
  522.         dc.l    0
  523.         dc.l    0
  524.  
  525.         dc.l    0        1C
  526.         dc.l    0
  527.         dc.l    0
  528.         dc.l    0
  529.  
  530.         dc.l    Rocky MAN    20
  531.         dc.l    0        21
  532.         dc.l    0        22
  533.         dc.l    0        23
  534.         dc.l    Rocky WMAN    24
  535.         dc.l    0        25
  536.         dc.l    0        26
  537.         dc.l    0        27
  538.  
  539.         dc.l    rock    ROCK    28    ;AND MASK8 = ROCK
  540.         dc.l    0        29
  541.         dc.l    0        2A
  542.         dc.l    0        2B
  543.         dc.l    rock    FROCK    2C    ;AND MASK4 = FROCK
  544.         dc.l    rock    FROCK    2D    
  545.         dc.l    rock    FROCK    2E
  546.         dc.l    rock    FROCK    2F
  547.  
  548.         dc.l    big_butterfly    30    ;AND MASK4 = BUTTER_FLY
  549.         dc.l    big_butterfly    31
  550.         dc.l    big_butterfly    32
  551.         dc.l    big_butterfly    33
  552.  
  553.         dc.l    big_firefly    34    ;AND MASK4 = FIRE_FLY
  554.         dc.l    big_firefly    35
  555.         dc.l    big_firefly    36
  556.         dc.l    big_firefly    37
  557.  
  558.         dc.l    fire_tap FIRE_TAP 38
  559.         dc.l    fire_tap    39
  560.         dc.l    fire_tap    3A
  561.         dc.l    fire_tap    3B
  562.  
  563.         dc.l    big_firefly    3C
  564.         dc.l    big_firefly
  565.         dc.l    big_firefly
  566.         dc.l    big_firefly
  567.  
  568.         dc.l    bfly_diam_1    40
  569.         dc.l    bfly_diam_2    41
  570.         dc.l    bfly_diam_3    42
  571.         dc.l    bfly_diam_4    43
  572.  
  573.         dc.l    rock_ffly_1    44
  574.         dc.l    rock_ffly_2    45
  575.         dc.l    rock_ffly_3    46
  576.         dc.l    rock_ffly_4    47
  577.         
  578.         dc.l    ffly_air_1    48
  579.         dc.l    ffly_air_2    49
  580.         dc.l    ffly_air_3    4A
  581.         dc.l    ffly_air_4    4B
  582.  
  583.         dc.l    air_expl_1    4C
  584.         dc.l    air_expl_2    4D
  585.  
  586.         dc.l    amib_diam_1    4E
  587.         dc.l    amib_diam_2    4F
  588.  
  589.         dc.l    amib_rock_1    50
  590.         dc.l    amib_rock_2    51
  591.         dc.l    0        52
  592.         dc.l    0        53
  593.  
  594.         dc.l    diam_bfly_1    54
  595.         dc.l    diam_bfly_2    55
  596.         dc.l    diam_bfly_3    56
  597.         dc.l    diam_bfly_4    57
  598.  
  599.         dc.l    0        58
  600.         dc.l    0
  601.         dc.l    0
  602.         dc.l    0
  603.  
  604.         dc.l    0        5C
  605.         dc.l    0        5D
  606.         dc.l    0        5E
  607.         dc.l    0        5F
  608.  
  609.         dc.l    fall_drop    60
  610.         dc.l    fall_drop    61
  611.         dc.l    horiz_drop_r    62
  612.         dc.l    horiz_drop_r    63
  613.  
  614.         dc.l    horiz_drop_l    64
  615.         dc.l    horiz_drop_l    65
  616.         dc.l    expl_drop1    66
  617.         dc.l    expl_drop2    67
  618.  
  619.         dc.l    flame        68
  620.         dc.l    flame        69
  621.         dc.l    horiz_flame_r    6A
  622.         dc.l    horiz_flame_r    6B
  623.  
  624.         dc.l    horiz_flame_l    6C
  625.         dc.l    horiz_flame_l    6D
  626.         dc.l    0
  627.         dc.l    0
  628.  
  629.         dc.l    begg    BEGG    70
  630.         dc.l    begg        71
  631.         dc.l    begg        72
  632.         dc.l    begg        73
  633.  
  634.         dc.l    exit_1    EXIT    74
  635.         dc.l    exit_2        75
  636.         dc.l    exit_3        76
  637.         dc.l    exit_4        77
  638.  
  639.         dc.l    bonus_1    NUMBER    78
  640.         dc.l    bonus_2        79
  641.         dc.l    bonus_3        7A
  642.         dc.l    bonus_4        7B
  643.  
  644.         dc.l    extra_t1 EXTRA_T 7C
  645.         dc.l    extra_t2     7D
  646.         dc.l    extra_t3     7E
  647.         dc.l    extra_t4     7F
  648.  
  649.         dc.l    extra_l1 EXTRA_L 80
  650.         dc.l    extra_l2     81
  651.         dc.l    extra_l3     82
  652.         dc.l    extra_l4     83
  653.  
  654.         dc.l    gegg    GEGG    84
  655.         dc.l    gegg        85
  656.         dc.l    gegg        86
  657.         dc.l    gegg        87
  658.  
  659.         dc.l    diamond    DIAMOND    88
  660.         dc.l    0        89
  661.         dc.l    0        8A
  662.         dc.l    0        8B
  663.         dc.l    diamond FDIAMOND 8C
  664.         dc.l    0        8D
  665.         dc.l    0        8E
  666.         dc.l    0        8F
  667.  
  668.         dc.l    0 GS_HEAD    90
  669.         dc.l    0
  670.         dc.l    0
  671.         dc.l    0
  672.  
  673.         dc.l    0        94
  674.         dc.l    0
  675.         dc.l    0
  676.         dc.l    0
  677.  
  678.         dc.l    0 GS_SEGM    98
  679.         dc.l    0
  680.         dc.l    0
  681.         dc.l    0
  682.  
  683.         dc.l    0        9C
  684.         dc.l    0
  685.         dc.l    0
  686.         dc.l    0
  687.  
  688.         dc.l    0 GS_TAIL    A0
  689.         dc.l    0
  690.         dc.l    0
  691.         dc.l    0
  692.  
  693.         dc.l    0        A4
  694.         dc.l    0
  695.         dc.l    0
  696.         dc.l    0
  697.  
  698.         dc.l    0        A8
  699.         dc.l    0
  700.         dc.l    0
  701.         dc.l    0
  702.  
  703.         dc.l    0        AC
  704.         dc.l    0
  705.         dc.l    0
  706.         dc.l    0
  707.  
  708.         dc.l    big_butterfly    B0
  709.         dc.l    big_butterfly
  710.         dc.l    big_butterfly
  711.         dc.l    big_butterfly
  712.  
  713.         dc.l    big_firefly    B4
  714.         dc.l    big_firefly
  715.         dc.l    big_firefly
  716.         dc.l    big_firefly
  717.  
  718.         dc.l    0        B8
  719.         dc.l    0
  720.         dc.l    0
  721.         dc.l    0
  722.  
  723.         dc.l    big_firefly    BC
  724.         dc.l    big_firefly
  725.         dc.l    big_firefly
  726.         dc.l    big_firefly
  727.  
  728.         dc.l    0        C0
  729.         dc.l    0
  730.         dc.l    0
  731.         dc.l    0
  732.  
  733.         dc.l    water_tap    C4
  734.         dc.l    water_tap
  735.         dc.l    water_tap
  736.         dc.l    water_tap
  737.  
  738.         dc.l    0        C8
  739.         dc.l    0        
  740.         dc.l    0        
  741.         dc.l    0        
  742.  
  743.         dc.l    0        CC
  744.         dc.l    0        
  745.         dc.l    0        
  746.         dc.l    0        
  747.  
  748.         dc.l    0        D0
  749.         dc.l    0
  750.         dc.l    0
  751.         dc.l    0
  752.  
  753.         dc.l    0        D4
  754.         dc.l    0
  755.         dc.l    0
  756.         dc.l    0
  757.  
  758.         dc.l    0        D8
  759.         dc.l    0
  760.         dc.l    0
  761.         dc.l    0
  762.  
  763.         dc.l    0        DC
  764.         dc.l    0
  765.         dc.l    0
  766.         dc.l    0
  767.  
  768.         dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 E0
  769.         dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 F0
  770. ;---------------------------------------
  771. handle_amiba    tst.w    amiba_count
  772.         beq    no_blob
  773.         cmp.w    #MAP_SIZE/4,amiba_count
  774.         bcc.s    too_many
  775.         tst.b    added_amiba
  776.         bne    no_blob
  777.         move.w    #EXPL_AMIB_DIAM,d1
  778.         bra    kill_amiba
  779. too_many    move.w    #EXPL_AMIB_ROCK,d1
  780. kill_amiba    move.w    #AMIBA,d0
  781.         moveq    #MASK4,d2
  782.         bsr    replace_cells
  783.         clr.w    amiba_count    ;no more amiba stuff !
  784. no_blob        rts
  785. ;---------------------------------------
  786. handle_diams    tst.b    enough_diamonds
  787.         bne    not_enough
  788.         tst.w    diamonds
  789.         bne    not_enough
  790.         move.b    #FLASH_TIME,flash
  791.         moveq    #3,d0
  792.         and.w    level,d0
  793.         add.w    d0,d0
  794.         add.w    d0,d0
  795.         move.l    world_ptr,a0
  796.         move.l    greedy_value(a0,d0),price
  797.         st    enough_diamonds
  798. not_enough    rts
  799. ;---------------------------------------
  800. handle_ewall    tst.b    magic_walls    ;is magic mode ON ?
  801.         beq    no_ewalls    ;yes,
  802.  
  803.         subq.w    #1,magic_timer    ;keep track of time: magic doesn't
  804.         bne    no_ewalls    ;last forever
  805.  
  806.         move.w    #EWALL,d0    ;time's up !
  807.         move.w    #WALL,d1    
  808.         moveq    #MASK4,d2
  809.         bsr    replace_cells    ;no more magic !
  810.  
  811.         sf    magic_walls
  812.  
  813. no_ewalls    rts
  814. ;---------------------------------------
  815. neighb_offsets    dc.w    -COLUMNS,1,COLUMNS,-1    ;U,R,D,L        
  816. ;---------------------------------------
  817. ; A0 -> SNAKE structure
  818.  
  819. handle_snake    tst.b    SNK_hatched(a0)
  820.         beq    no_ewalls
  821.  
  822.         move.w    SNK_head_index(a0),d0
  823.         move.w    d0,d1
  824.         add.w    d1,d1
  825.         add.w    d1,d1
  826.         moveq    #0,d2
  827.         move.b    SNK_dir_codes(a0,d0),d2
  828.         move.w    d2,d3
  829.         move.l    SNK_segm_ptrs(a0,d1),a1
  830.         add.w    d3,d3
  831.         move.l    a1,a3
  832.         lea    neighb_offsets,a2
  833.         adda.w    0(a2,d3),a3
  834.         tst.b    (a3)        ;AIR in front ?
  835.         beq    move_snake    ;no,
  836.         cmp.b    #ROCK,(a3)    ;ROCK in front ?
  837.         bne    test_alt_dirs
  838.         cmp.b    #EXPL_ROCK_FFLY,SNK_turn_rocks_into(a0)
  839.         bne    unconditional
  840.         move.w    #100,d1
  841.         bsr    rnd
  842.         cmp.w    #BSNAKE_BADNESS,d0
  843.         bcc.s    test_alt_dirs
  844. unconditional    move.b    SNK_turn_rocks_into(a0),(a3)
  845.  
  846. test_alt_dirs    move.w    d2,d3    ;test relative RIGHT & LEFT cells
  847.         addq.b    #1,d3
  848.         and.w    #3,d3
  849.         move.w    d3,d6    ;rem new direction for relative RIGHT
  850.         add.w    d3,d3
  851.         move.l    a1,a3
  852.         adda.w    0(a2,d3),a3
  853.         move.l    a3,a4    ;rem new address
  854.         tst.b    (a3)
  855.         seq    D4    ;AIR at relative RIGHT
  856.  
  857.         move.w    d2,d3
  858.         subq.b    #1,d3
  859.         and.w    #3,d3
  860.         move.w    d3,d7
  861.         add.w    d3,d3
  862.         move.l    a1,a3
  863.         adda.w    0(a2,d3),a3
  864.         tst.b    (a3)
  865.         seq    D5    ;AIR at relative LEFT
  866.  
  867.         tst.b    D4        ;RIGHT blocked ?
  868.         beq    snake_left    ;no,
  869.         tst.b    D5        ;LEFT blocked ?
  870.         beq    snake_right    ;no,
  871.         move.w    #10000,d1    ;choose random direction
  872.         bsr    rnd
  873.         cmp.w    #5000,d0
  874.         bcc    snake_left
  875.  
  876. snake_right    tst.b    D4        ;can i go right ?
  877.         beq    reverse_snake
  878.         move.b    d6,d2
  879.         move.l    a4,a3
  880.         bra    move_snake
  881.  
  882. snake_left    tst.b    D5        ;can i go left ?
  883.         beq    reverse_snake
  884.         move.b    d7,d2
  885.  
  886. move_snake    lea    SNK_head_index(a0),a6    ;advance in circular buffer
  887.         move.w    (a6),d0
  888.         addq.w    #1,d0
  889.         and.w    #7,d0
  890.         move.w    d0,(a6)
  891.         move.b    d2,SNK_dir_codes(a0,d0)    ;same direction as old head
  892.         add.w    d0,d0
  893.         add.w    d0,d0
  894.         cmp.b    #8,SNK_length(a0)
  895.         beq    erase_tail
  896.         addq.b    #1,SNK_length(a0)
  897.         bra    grow_snake
  898. erase_tail    move.l    SNK_segm_ptrs(a0,d0),a2
  899.         clr.b    (a2)            ;erase tail cell if len=8
  900. grow_snake    move.l    a3,SNK_segm_ptrs(a0,d0)
  901.         bra    copy_codes
  902. ;---------------------------------------
  903. reverse_snake    move.b    SNK_length(a0),d0
  904.         subq.b    #1,d0
  905.         beq    copy_codes
  906.         lea    SNK_reversebuf1(a0),a1
  907.         lea    SNK_reversebuf2(a0),a2
  908.         moveq    #0,d0
  909.         move.b    SNK_length(a0),d0
  910.         subq.b    #1,d0
  911.         move.w    SNK_head_index(a0),d1
  912.         move.w    d1,d2
  913.         add.w    d2,d2
  914.         add.w    d2,d2
  915. rev_copy    move.l    SNK_segm_ptrs(a0,d2),(a1)+
  916.         move.b    SNK_dir_codes(a0,d1),d3
  917.         addq.b    #2,d3        ;turn 180 degrees
  918.         and.w    #3,d3
  919.         move.b    d3,(a2)+
  920.         subq.w    #1,d1        ;go back !
  921.         subq.w    #4,d2
  922.         and.w    #7,d1
  923.         and.w    #31,d2
  924.         dbra    d0,rev_copy
  925.  
  926.         lea    SNK_reversebuf1(a0),a1
  927.         lea    SNK_reversebuf2(a0),a2
  928.         lea    SNK_segm_ptrs(a0),a3
  929.         lea    SNK_dir_codes(a0),a4
  930.         moveq    #8-1,d0
  931. copy_snake_info    move.l    (a1)+,(a3)+
  932.         move.b    (a2)+,(a4)+
  933.         dbra    d0,copy_snake_info
  934.  
  935.         moveq    #0,d0
  936.         move.b    SNK_length(a0),d0
  937.         subq.w    #1,d0
  938.         move.w    d0,SNK_head_index(a0)    ;FALL THROUGH *!
  939. ;---------------------------------------
  940. copy_codes    moveq    #1,d4
  941.         and.w    anim_clock,d4
  942.  
  943.         move.w    SNK_head_index(a0),d0
  944.         move.w    d0,d1
  945.         add.w    d1,d1
  946.         add.w    d1,d1
  947.         moveq    #0,d2
  948.         move.b    SNK_dir_codes(a0,d0),d2
  949.         move.b    SNK_head_codes(a0,d2),d2
  950.         or.b    d4,d2        ;add animation
  951.         move.l    SNK_segm_ptrs(a0,d1),a1
  952.         move.b    d2,(a1)        ;poke head cell
  953.  
  954.         move.b    SNK_length(a0),d3
  955.         subq.b    #3,d3            ;-head  -tail
  956.         bmi.s    skip_segments
  957. set_segments    subq.w    #1,d0            ;going down !
  958.         subq.w    #4,d1
  959.         and.w    #7,d0
  960.         and.w    #31,d1
  961.         move.b    SNK_dir_codes(a0,d0),d2
  962.         move.b    SNK_segm_codes(a0,d2),d2
  963.         or.b    d4,d2
  964.         move.l    SNK_segm_ptrs(a0,d1),a1
  965.         move.b    d2,(a1)
  966.         subq.b    #1,d3
  967.         bpl.s    set_segments
  968.  
  969. skip_segments    move.b    SNK_length(a0),d3
  970.         subq.b    #1,d3
  971.         beq    no_tail
  972.         subq.w    #1,d0
  973.         subq.w    #4,d1
  974.         and.w    #7,d0
  975.         and.w    #31,d1
  976.         move.b    SNK_dir_codes(a0,d0),d2
  977.         move.b    SNK_tail_codes(a0,d2),d2
  978.         or.b    d4,d2
  979.         move.l    SNK_segm_ptrs(a0,d1),a1
  980.         move.b    d2,(a1)
  981. no_tail        rts
  982. ;---------------------------------------
  983. ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
  984. ;*-*-*-*-*-*-*-*-*-    CELL    FUNCTIONS    *-*-*-*-*-*-*-*-*-
  985. ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
  986. *
  987. *    INPUTS        D0     = current cel #
  988. *            A1/A2    -> cell_map,flag_map current cel
  989. *            A6    -> return addr to main loop !!!!!
  990. *
  991. *    MACROS use    D7(,D6(,D5))  as scratch register(s)
  992.  
  993. DONE    MACRO
  994.     jmp    (a6)
  995.     ENDM
  996.  
  997. ;---------------------------------------
  998. circle_offsets    dc.w    -COLUMNS,-COLUMNS+1,1,COLUMNS+1    ;U,UR,R,DR
  999.         dc.w    COLUMNS,COLUMNS-1,-1,-COLUMNS-1    ;D,DL,L,UL
  1000. ;---------------------------------------
  1001. big_butterfly    bchg    #7,d0        ;flap wings
  1002.         tst.w    amiba_count    ;if there are any AMIBAs around,
  1003.         beq    no_amibas
  1004.         bsr    touch_amiba1    ;see if BUTTERFLY is touching one !
  1005.  
  1006. no_amibas    lea    circle_offsets,a0
  1007.         moveq    #3,d1
  1008.         and.w    d0,d1        ;get current movement heading
  1009.         move.w    d1,d2        ;00..11 for U/R/D/L
  1010.         add.w    d2,d2
  1011.         add.w    d2,d2        ;skip diagonals
  1012.         move.w    d2,d3
  1013.         move.w    0(a0,d2),d3    ;get addressing offset
  1014.         lea    0(a1,d3.w),a3
  1015.         lea    0(a2,d3.w),a4
  1016.         tst.b    (a3)        ;obstacle in front ? (non-AIR cell)
  1017.         bne    rotate_bfly    ;yes, turn anti-clockwise
  1018.  
  1019.         addq.w    #2,d2        ;alternatively AIR diagonally right ?
  1020.         move.w    0(a0,d2),d3
  1021.         tst.b    0(a1,d3.w)
  1022.         bne    go_fwd_bfly
  1023.  
  1024.         addq.w    #1,d1        ;hug walls
  1025.         and.w    #3,d1
  1026.         or.w    #BUTTER_FLY,d1
  1027.         and.w    #$80,d0
  1028.         or.w    d1,d0
  1029.  
  1030. go_fwd_bfly    move.b    d0,(a3)        ;store 'animated' cell back
  1031.         st    (a4)
  1032.  
  1033. and_clear    SETCEL    AIR        
  1034.         DONE
  1035. ;---------------
  1036. rotate_bfly    subq.w    #1,d1        ;anti-clockwise turn on the
  1037.         and.w    #3,d1        ;spot for obstacles
  1038.         or.w    #BUTTER_FLY,d1
  1039.         and.w    #$80,d0
  1040.         or.w    d0,d1
  1041.         SETCELR    d1
  1042.         DONE
  1043. ;---------------------------------------
  1044. big_firefly    bchg    #7,d0        ;rotate through banks 34,B4,3C,BC
  1045.         bne    no_high
  1046.         bchg    #3,d0
  1047. no_high        tst.w    amiba_count
  1048.         beq    no_amibas2
  1049.         bsr    touch_amiba2
  1050.  
  1051. no_amibas2    lea    circle_offsets,a0    
  1052.         moveq    #3,d1
  1053.         and.w    d0,d1        ;get current heading
  1054.         move.w    d1,d2
  1055.         add.w    d2,d2
  1056.         add.w    d2,d2        ;skip diagonals
  1057.         move.w    d2,d3
  1058.         move.w    0(a0,d2),d3    ;get addressing offset
  1059.         lea    0(a1,d3.w),a3
  1060.         lea    0(a2,d3.w),a4
  1061.         tst.b    (a3)        ;AIR in front ?
  1062.         bne    rotate_ffly
  1063.         move.w    d1,d2
  1064.         subq.w    #1,d2
  1065.         and.w    #3,d2
  1066.         add.w    d2,d2
  1067.         add.w    d2,d2
  1068.         addq.w    #2,d2        ;and AIR diagonally left ?
  1069.         move.w    0(a0,d2),d3
  1070.         tst.b    0(a1,d3.w)
  1071.         bne    go_fwd_ffly
  1072.  
  1073.         subq.w    #1,d1        ;hug walls
  1074.         and.w    #3,d1
  1075.         or.w    #FIRE_FLY,d1
  1076.         and.w    #$88,d0
  1077.         or.w    d1,d0
  1078. go_fwd_ffly    move.b    d0,(a3)
  1079.         st    (a4)
  1080. and_clear2    SETCEL    AIR
  1081.         DONE
  1082.  
  1083. rotate_ffly    addq.w    #1,d1        ;clockwise turn on the
  1084.         and.w    #3,d1        ;spot for obstacles
  1085.         or.w    #FIRE_FLY,d1
  1086.         and.w    #$88,d0
  1087.         or.w    d0,d1
  1088.         SETCELR    d1
  1089.         DONE
  1090. ;---------------------------------------
  1091. rock        COMP_D    AIR        ;if falling,
  1092.         bne    not_down
  1093.         addq.w    #1,d0        ;can't use NEXCELL here
  1094.         moveq    #3,d1
  1095.         and.w    d0,d1
  1096.         or.w    #FROCK,d1
  1097.         SETR_D    d1
  1098.         SETCEL    AIR
  1099.         DONE
  1100.  
  1101. not_down    COMP_D    ROCK        ;test unstability
  1102.         beq    unstable
  1103.         COMP_D    DIAMOND
  1104.         beq    unstable
  1105.         COMP_D    WALL
  1106.         beq    unstable
  1107.  
  1108.         move.w    #EXPL_FFLY_AIR,d2    ;if on fire fly
  1109.         COMPM_D    FFLY_MASK,FIRE_FLY
  1110.         beq    kill_it00
  1111.         move.w    #EXPL_BFLY_DIAM,d2    ;if on butter fly
  1112.         COMPM_D    BFLY_MASK,BUTTER_FLY
  1113.         beq    kill_it00
  1114.         move.w    #EXPL_AIR,d2
  1115.         COMPM_D    MASK8,MAN        ;if on Rocky
  1116.         bne    done_rock
  1117.  
  1118. kill_it00    moveq    #MASK4,d1    ;if I'm a killer rock AND
  1119.         and.w    d0,d1
  1120.         cmp.b    #FROCK,d1
  1121.         bne    done_rock
  1122.         move.w    d2,d0
  1123.         bsr    explode_under    ;center under current cel
  1124.  
  1125. unstable    COMP_R    AIR        ;test right diag slide
  1126.         bne    not_right
  1127.         COMP_DR    AIR
  1128.         bne    not_right
  1129.         SET_DR    FROCK
  1130.         SETCEL    AIR
  1131.         DONE
  1132.  
  1133. not_right    COMP_L    AIR        ;test left diag slide
  1134.         bne    done_rock
  1135.         COMP_DL    AIR
  1136.         bne    done_rock
  1137.         SET_DL    FROCK
  1138.         SETCEL    AIR
  1139.         DONE
  1140.  
  1141. done_rock    moveq    #MASK4,d0
  1142.         and.b    (a1),d0
  1143.         cmp.b    #FROCK,d0
  1144.         bne    sit_there
  1145.         st    bonk
  1146. sit_there    SETCEL    ROCK        ;always point up if stable
  1147.         DONE
  1148. ;---------------------------------------
  1149. diamond        COMP_D    AIR        ;if in mid air,
  1150.         bne    not_down2
  1151.         SET_D    FDIAMOND    ;drop 1
  1152.         SETCEL    AIR
  1153.         DONE
  1154.  
  1155. not_down2    COMP_D    ROCK
  1156.         beq    unstable2
  1157.         COMP_D    DIAMOND
  1158.         beq    unstable2
  1159.  
  1160.         move.w    #EXPL_FFLY_AIR,d2    ;if on fire fly
  1161.         COMPM_D    FFLY_MASK,FIRE_FLY
  1162.         beq    kill_it01
  1163.         move.w    #EXPL_BFLY_DIAM,d2    ;on butter fly
  1164.         COMPM_D    BFLY_MASK,BUTTER_FLY
  1165.         beq    kill_it01        
  1166.         COMPM_D    MASK8,MAN        ;on Rocky
  1167.         bne    done_rock2
  1168.  
  1169. kill_it01    cmp.b    #FDIAMOND,d0    ;if falling diamond
  1170.         bne    done_rock2
  1171.         move.w    d2,d0
  1172.         bsr    explode_under    ;destroy with center down 1
  1173.  
  1174. unstable2    COMP_R    AIR
  1175.         bne    not_right2
  1176.         COMP_DR    AIR
  1177.         bne    not_right2
  1178.         SET_DR    FDIAMOND
  1179.         SETCEL    AIR
  1180.         DONE
  1181.  
  1182. not_right2    COMP_L    AIR
  1183.         bne    done_rock2
  1184.         COMP_DL    AIR
  1185.         bne    done_rock2
  1186.         SET_DL    FDIAMOND
  1187.         SETCEL    AIR
  1188.         DONE
  1189.  
  1190. done_rock2    cmp.b    #FDIAMOND,(a1)
  1191.         bne    no_ping
  1192.         st    ping
  1193. no_ping        SETCEL    DIAMOND
  1194.         DONE
  1195. ;---------------------------------------
  1196. ; Growing Wall
  1197. ; ------------
  1198. gwall        COMP_R    AIR
  1199.         bne    no_grow_r
  1200.         SET_R    GWALL
  1201.         DONE
  1202.  
  1203. no_grow_r    COMP_L    AIR
  1204.         bne    dont_grow
  1205.         SET_L    GWALL
  1206. dont_grow    DONE
  1207. ;---------------------------------------
  1208. ; Enchanted Wall    (turns Rocks into Diamonds once a rock drops on it)
  1209. ; --------------
  1210. ewall        tst.b    magic_walls    ;magic mode activated ?
  1211.         beq    not_started
  1212.  
  1213.         NEXCELL    MASK4,EWALL
  1214.         COMP_U    ROCK        ;has to be a stable rock
  1215.         bne    maybe_diam
  1216.         SET_U    EXPL_AIR
  1217.         COMP_D    AIR
  1218.         bne    no_cave
  1219.         SET_D    DIAMOND
  1220.         DONE
  1221.  
  1222. maybe_diam    COMP_U    DIAMOND
  1223.         bne    no_cave
  1224.         SET_U    EXPL_AIR
  1225.         COMP_D    AIR
  1226.         bne    no_cave
  1227.         SET_D    ROCK
  1228. no_cave        DONE
  1229. ;---------------
  1230. not_started    COMPM_U    MASK4,FROCK    ;is a Falling Rock on top of me ?
  1231.         bne    maybe_diam2    ;yes,
  1232.  
  1233. start_magic    st    magic_walls    ;start magic mode
  1234.         move.w    #MAGIC_TIME,magic_timer    ;and start a timer
  1235.         DONE
  1236.  
  1237. maybe_diam2    COMP_U    FDIAMOND    ;or maybe a Falling Diamond ?
  1238.         beq    start_magic
  1239.         DONE
  1240. ;---------------------------------------
  1241. fwall        NEXCELL    MASK4,FWALL        ;animate FILTER wall
  1242.  
  1243.         move.w    #400,d1            ;every so often...
  1244.         bsr    rnd
  1245.         subq.w    #2,d0            ;see if we should let something
  1246.         bpl.s    block_filter        ;drop through
  1247.  
  1248.         COMP_D    AIR            ;cavity underneath to receive
  1249.         bne    block_filter        ;ROCK or DIAMOND ?
  1250.  
  1251.         COMP_U    ROCK
  1252.         bne    pass_diam        ;yes,
  1253.         SET_U    EXPL_AIR        ;dissolve ROCK above wall
  1254.         SET_D    FROCK            ;and gen ROCK below wall !
  1255.         DONE
  1256.  
  1257. pass_diam    COMP_U    DIAMOND
  1258.         bne    block_filter
  1259.         SET_U    AIR
  1260.         SET_D    DIAMOND
  1261. block_filter    DONE
  1262. ;---------------------------------------
  1263. amiba        moveq    #AMIBA_SPEED,d1
  1264.         bsr    rnd
  1265.         subq.w    #2,d0
  1266.         spl    D1        ;if D1=TRUE don't occupie if poss.
  1267.         and.w    #3,d0
  1268.         or.w    #AMIBA,d0    ;random AMIBA char
  1269.         SETCELR    d0
  1270.         
  1271.         COMPM_R    MASK2,AIR    ;if (AIR or GRASS)
  1272.         bne    encl_00
  1273.         tst.b    D1
  1274.         bne    sneaky
  1275.         SETR_R    D0        ;occupy cell
  1276.         bra    done_amiba
  1277.  
  1278. encl_00        COMPM_L    MASK2,AIR
  1279.         bne    encl_01
  1280.         tst.b    D1
  1281.         bne    sneaky
  1282.         SETR_L    D0
  1283.         bra    done_amiba
  1284.  
  1285. encl_01        COMPM_U    MASK2,AIR
  1286.         bne    encl_02
  1287.         tst.b    D1
  1288.         bne    sneaky
  1289.         SETR_U    D0
  1290.         bra    done_amiba
  1291.  
  1292. encl_02        COMPM_D    MASK2,AIR
  1293.         bne    stuck
  1294. eat_03        tst.b    D1
  1295.         bne    sneaky
  1296.         SETR_D    D0
  1297.  
  1298. done_amiba    addq.w    #1,amiba_count
  1299. sneaky        st    added_amiba
  1300. stuck        DONE
  1301. ;---------------------------------------
  1302. ;--------------- TAP STUFF
  1303. ;---------------------------------------
  1304. water_tap    tst.b    water_taps_on
  1305.         beq    dont_leak
  1306.         NEXCELL    MASK4,WATER_TAP
  1307.         move.w    anim_clock,d0
  1308.         addq.w    #4,d0
  1309.         and.w    #DROPS_SPEED<<1+1,d0
  1310.         bne    dont_leak
  1311.         COMP_D    AIR
  1312.         bne    dont_leak
  1313.         SET_D    FALLING_DROP
  1314. dont_leak    DONE
  1315. ;---------------------------------------
  1316. fall_drop    btst    #0,anim_clock+1
  1317.         bne    dont_leak
  1318.         bchg    #0,(a1)
  1319.         moveq    #DROPS_SPEED,d1
  1320.         and.w    anim_clock,d1
  1321.         bne    dont_leak
  1322.         COMP_D    AIR
  1323.         bne    fire_collide
  1324.         addq.w    #1,d0
  1325.         and.w    #1,d0
  1326. flow        or.b    #FALLING_DROP,d0
  1327.         SETR_D    d0
  1328.         SETCEL    AIR
  1329.         DONE
  1330.         
  1331. fire_collide    COMPM_D    MASK4,FLAME
  1332.         beq    fire_and_water
  1333.         SETCEL    EXPL_DROP
  1334.         DONE
  1335.  
  1336. fire_and_water    move.w    #EXPL_AIR,d0
  1337.         bsr    explode
  1338. ;---------------------------------------
  1339. horiz_drop_r    bsr    touch_bfly
  1340.         btst    #0,anim_clock+1
  1341.         bne    dont_leak
  1342.         bchg    #0,(a1)
  1343.         moveq    #DROPS_SPEED,d1
  1344.         and.w    anim_clock,d1
  1345.         bne    dont_leak
  1346.         addq.w    #1,d0
  1347.         and.w    #1,d0
  1348.         COMP_D    AIR
  1349.         beq    flow
  1350. flow_right    COMP_R    AIR
  1351.         bne    flow_left
  1352.         or.w    #HR_DROP,d0
  1353.         SETR_R    d0
  1354.         SETCEL    AIR
  1355.         DONE
  1356.  
  1357. flow_left    COMP_L    AIR
  1358.         bne    get_nervous
  1359.         or.w    #HL_DROP,d0
  1360.         SETR_L    d0
  1361.         SETCEL    AIR
  1362.         DONE
  1363.  
  1364. get_nervous    move.w    #100,d1
  1365.         bsr    rnd
  1366.         cmp.w    #DROP_NERVES,d0
  1367.         bcc.s    kool_it
  1368.         SETCEL    EXPL_AIR
  1369. kool_it        DONE
  1370. ;---------------------------------------
  1371. horiz_drop_l    bsr    touch_bfly
  1372.         btst    #0,anim_clock+1
  1373.         bne    dont_leak
  1374.         bchg    #0,(a1)
  1375.         moveq    #DROPS_SPEED,d1
  1376.         and.w    anim_clock,d1
  1377.         bne    dont_leak
  1378.         addq.w    #1,d0
  1379.         and.w    #1,d0
  1380.         COMP_D    AIR
  1381.         beq    flow
  1382.         COMP_L    AIR
  1383.         beq    flow_left
  1384.         COMP_R    AIR
  1385.         beq    flow_right
  1386.         bra    get_nervous
  1387. ;---------------------------------------
  1388. fire_tap    tst.b    fire_taps_on
  1389.         beq    no_fires
  1390.         NEXCELL    MASK4,FIRE_TAP
  1391.         move.w    anim_clock,d0
  1392.         addq.w    #4,d0
  1393.         and.w    #DROPS_SPEED<<1+1,d0
  1394.         bne    no_fires
  1395.         COMP_U    AIR
  1396.         bne    no_fires
  1397.         SET_U    FLAME
  1398. no_fires    DONE
  1399. ;---------------------------------------
  1400. flame        COMP_U    AIR
  1401.         bne    flame_stuck
  1402. burn        moveq    #DROPS_SPEED,d1
  1403.         and.w    anim_clock,d1
  1404.         bne    dont_rise
  1405.         addq.w    #1,d0
  1406.         and.w    #1,d0
  1407.         or.w    #FLAME,d0
  1408.         SETR_U    d0
  1409.         SETCEL    AIR
  1410.         DONE
  1411.  
  1412. flame_stuck    SETCEL    HR_FLAME
  1413. dont_rise    DONE
  1414. ;---------------------------------------
  1415. horiz_flame_r    COMP_U    AIR
  1416.         beq    burn
  1417.         moveq    #DROPS_SPEED,d1
  1418.         and.w    anim_clock,d1
  1419.         bne    no_fires
  1420.         COMP_R    AIR
  1421.         beq    burn_right0
  1422.         COMP_R    DIAMOND
  1423.         bne    burn_left0
  1424.         SET_R    EXPL_DIAM_BFLY
  1425.         DONE
  1426.  
  1427. burn_right0    addq.w    #1,d0
  1428.         and.w    #1,d0
  1429.         or.w    #HR_FLAME,d0
  1430.         SETR_R    d0
  1431.         SETCEL    AIR
  1432.         DONE
  1433.  
  1434. burn_left0    COMP_L    AIR
  1435.         bne    get_nervous
  1436.         SET_L    HL_FLAME
  1437.         SETCEL    AIR
  1438.         DONE
  1439. ;---------------------------------------
  1440. horiz_flame_l    COMP_U    AIR
  1441.         beq    burn
  1442.         moveq    #DROPS_SPEED,d0
  1443.         and.w    anim_clock,d0
  1444.         bne    no_fires
  1445.         COMP_L    AIR
  1446.         beq    burn_left1
  1447.         COMP_L    DIAMOND
  1448.         bne    burn_right1
  1449.         SET_L    EXPL_DIAM_BFLY
  1450.         DONE
  1451.  
  1452. burn_left1    addq.w    #1,d0
  1453.         and.w    #1,d0
  1454.         or.w    #HL_FLAME,d0
  1455.         SETR_L    d0
  1456.         SETCEL    AIR
  1457.         DONE
  1458.  
  1459. burn_right1    COMP_R    AIR
  1460.         bne    get_nervous
  1461.         SET_R    HR_FLAME
  1462.         SETCEL    AIR
  1463.         DONE
  1464. ;---------------------------------------
  1465. MAN_U    equ    0
  1466. MAN_R    equ    2
  1467. MAN_D    equ    4
  1468. MAN_L    equ    6
  1469. MAN_PR    equ    8
  1470. MAN_PL    equ    10
  1471.  
  1472. SETCHAR        MACRO
  1473.         moveq    #1,d0
  1474.         and.w    anim_clock,d0
  1475.         or.w    #\1,d0
  1476.         move.w    d0,man_char
  1477.         ENDM
  1478. ;---------------------------------------
  1479. Rocky        tst.b    die_anyway
  1480.         bne    byebye
  1481.         tst.b    out_of_time    
  1482.         beq    dont_die
  1483. byebye        sf    die_anyway
  1484.         move.w    #EXPL_BFLY_DIAM,d0
  1485.         bsr    explode
  1486.  
  1487. dont_die    sf    rockf_died        ;I'm still alive !
  1488.         tst.b    disable_rockf
  1489.         bne    noblasting
  1490.         bsr    touch_bfly
  1491.         bsr    touch_ffly
  1492.         move.w    joystick,d0        ;read in fixed 'time place'
  1493.         btst    #FIRE,d0
  1494.         bne    blast_cell
  1495. ;---------
  1496. walk_right    btst    #RIGHT,d0        ;joystick pulled RIGHT ?
  1497.         beq    walk_left        ;yes,
  1498.  
  1499.         COMPM_R    MASK2,AIR        ;AIR in next cell?
  1500.         beq    move_right        ;yes: move into it
  1501.         COMPM_R    MASK16,DROPLETS        ;WATER DROPS in next cell?
  1502.         beq    move_right        ;yes: move into it
  1503.         COMP_R    DIAMOND            ;DIAMOND in next cell?
  1504.         bne    test_rest00
  1505.         bsr    add_diamond        ;eat DIAMOND (score++,diam--)
  1506.         bra    move_right
  1507.  
  1508. test_rest00    COMPM_R    MASK8,ROCK    ;if pushing against ROCK + AIR,
  1509.         bne    test_rest01
  1510.         COMP_RR    AIR
  1511.         bne    hopeless1
  1512.         subq.b    #1,energy    ;see if energy count OK
  1513.         bne    hopeless1
  1514.         moveq    #PUSH,d1    ;(generate new value for next time)
  1515.         bsr    rnd
  1516.         addq.w    #1,d0
  1517.         move.b    d0,energy
  1518.         move.b    2(a1),d0    ;get rock frame #
  1519.         addq.b    #1,d0        ;animate rolling rock 
  1520.         moveq    #3,d1
  1521.         and.b    d1,d0
  1522.         or.b    #FROCK,d0
  1523.         SETR_RR    d0
  1524.         bra    move_right
  1525.  
  1526. test_rest01    COMPM_R    MASK4,EXIT    ;next cell is EXIT ?
  1527.         bne    test_rest02    ;yes,
  1528.         tst.b    enough_diamonds    ;enough DIAMONDs collected ?
  1529.         beq    hopeless1
  1530.         st    found_exit    ;got EXIT !
  1531.         bra    move_right    ;move into that cell
  1532.  
  1533. test_rest02    COMPM_R    MASK4,EXTRA_L
  1534.         bne    test_rest03a
  1535.         addq.w    #1,lives
  1536.         bsr    show_lives
  1537.         bra    move_right
  1538. test_rest03a    COMPM_R    MASK4,EXTRA_T
  1539.         bne    test_rest03
  1540.         add.w    #BONUS_SECS,time_left
  1541.         bra    move_right
  1542. test_rest03    COMPM_R    MASK4,NUMBER
  1543.         bne    test_rest04
  1544.         moveq    #3,d0
  1545.         and.b    1(a1),d0
  1546.         mulu    #1000,d0
  1547.         add.l    d0,score
  1548.         bra    move_right
  1549. test_rest04    COMPM_R    MASK4,WATER_TAP
  1550.         bne    test_rest05
  1551.         st    water_taps_on
  1552.         bra    hopeless1
  1553. test_rest05    COMPM_R    MASK4,FIRE_TAP
  1554.         bne    test_rest06
  1555.         st    fire_taps_on
  1556.         bra    hopeless1
  1557. test_rest06    COMPM_R    MASK4,GEGG
  1558.         bne    test_rest07
  1559.         clr.w    gegg_timer    ;wake up snake !
  1560.         bra    hopeless1
  1561. test_rest07    COMPM_R    MASK4,BEGG
  1562.         bne    hopeless1
  1563.         clr.w    begg_timer
  1564. hopeless1    SETCHAR    MAN_PR
  1565.         SETCEL    MAN
  1566.         DONE
  1567.  
  1568. move_right    SETCHAR    MAN_R
  1569.         SET_R    MAN
  1570.         SETCEL    AIR
  1571.         addq.w    #1,rf_x
  1572.         bra    step_sound
  1573. ;--------
  1574. walk_left    btst    #LEFT,d0
  1575.         beq    walk_up
  1576.  
  1577.         COMPM_L    MASK2,AIR
  1578.         beq    move_left
  1579.         COMPM_L    MASK16,DROPLETS
  1580.         beq    move_left
  1581.         COMP_L    DIAMOND
  1582.         bne    test_rest10
  1583.         bsr    add_diamond
  1584.         bra    move_left
  1585. test_rest10    COMPM_L    MASK8,ROCK
  1586.         bne    test_rest11
  1587.         COMP_LL    AIR
  1588.         bne    hopeless2
  1589.         subq.b    #1,energy
  1590.         bne    hopeless2
  1591.         moveq    #PUSH,d1
  1592.         bsr    rnd
  1593.         addq.w    #1,d0
  1594.         move.b    d0,energy
  1595.         move.b    -2(a1),d0
  1596.         subq.b    #1,d0
  1597.         moveq    #3,d1
  1598.         and.b    d1,d0
  1599.         or.b    #FROCK,d0
  1600.         SETR_LL    d0
  1601.         bra    move_left
  1602. test_rest11    COMPM_L    MASK4,EXIT
  1603.         bne    test_rest12
  1604.         tst.b    enough_diamonds
  1605.         beq    hopeless2
  1606.         st    found_exit
  1607.         bra    move_left
  1608. test_rest12    COMPM_L    MASK4,EXTRA_L
  1609.         bne    test_rest13a
  1610.         addq.w    #1,lives
  1611.         bsr    show_lives
  1612.         bra    move_left
  1613. test_rest13a    COMPM_L    MASK4,EXTRA_T
  1614.         bne    test_rest13
  1615.         add.w    #BONUS_SECS,time_left
  1616.         bra    move_left
  1617. test_rest13    COMPM_L    MASK4,NUMBER
  1618.         bne    test_rest14
  1619.         moveq    #3,d0
  1620.         and.b    -1(a1),d0
  1621.         mulu    #1000,d0
  1622.         add.l    d0,score
  1623.         bra    move_left
  1624. test_rest14    COMPM_L    MASK4,WATER_TAP
  1625.         bne    test_rest15
  1626.         st    water_taps_on
  1627.         bra    hopeless2
  1628. test_rest15    COMPM_L    MASK4,FIRE_TAP
  1629.         bne    test_rest16
  1630.         st    fire_taps_on
  1631.         bra    hopeless2
  1632. test_rest16    COMPM_L    MASK4,GEGG
  1633.         bne    test_rest17
  1634.         clr.w    gegg_timer
  1635.         bra    hopeless2
  1636. test_rest17    COMPM_L    MASK4,BEGG
  1637.         bne    hopeless2
  1638.         clr.w    begg_timer
  1639. hopeless2    SETCHAR    MAN_PL
  1640.         SETCEL    MAN
  1641.         DONE
  1642.  
  1643. move_left    SETCHAR    MAN_L
  1644.         SET_L    MAN
  1645.         SETCEL    AIR
  1646.         subq.w    #1,rf_x
  1647.         bra    step_sound
  1648. ;--------
  1649. walk_up        btst    #UP,d0
  1650.         beq    walk_down
  1651.         COMPM_U    MASK2,AIR
  1652.         beq    move_up
  1653.         COMPM_U    MASK16,DROPLETS
  1654.         beq    move_up
  1655.         COMP_U    DIAMOND
  1656.         bne    test_rest20
  1657.         bsr    add_diamond
  1658.         bra    move_up
  1659. test_rest20    COMPM_U    MASK4,EXIT
  1660.         bne    test_rest21
  1661.         tst.b    enough_diamonds
  1662.         beq    stay
  1663.         st    found_exit
  1664.         bra    move_up
  1665. test_rest21    COMPM_U    MASK4,EXTRA_T
  1666.         bne    test_rest22
  1667.         add.w    #BONUS_SECS,time_left
  1668.         bra    move_up
  1669. test_rest22    COMPM_U    MASK4,EXTRA_L
  1670.         bne    test_rest23a    
  1671.         addq.w    #1,lives
  1672.         bsr    show_lives
  1673.         bra    move_up
  1674. test_rest23a    COMPM_U    MASK4,NUMBER
  1675.         bne    test_rest23
  1676.         moveq    #3,d0
  1677.         and.b    -COLUMNS(a1),d0
  1678.         mulu    #1000,d0
  1679.         add.l    d0,score
  1680.         bra    move_up
  1681. test_rest23    COMPM_U    MASK4,WATER_TAP
  1682.         bne    test_rest24
  1683.         st    water_taps_on
  1684.         bra    stay
  1685. test_rest24    COMPM_U    MASK4,FIRE_TAP
  1686.         bne    test_rest25
  1687.         st    fire_taps_on
  1688.         bra    stay
  1689. test_rest25    COMPM_U    MASK4,GEGG
  1690.         bne    test_rest26
  1691.         clr.w    gegg_timer
  1692.         bra    stay
  1693. test_rest26    COMPM_U    MASK4,BEGG
  1694.         bne    stay
  1695.         clr.w    begg_timer
  1696.         bra    stay
  1697.  
  1698. move_up        SETCHAR    MAN_U
  1699.         SET_U    MAN
  1700.         SETCEL    AIR
  1701.         subq.w    #1,rf_y
  1702.         bra    step_sound
  1703. ;---------
  1704. walk_down    btst    #DOWN,d0
  1705.         beq    stay
  1706.         COMPM_D    MASK2,AIR
  1707.         beq    move_down
  1708.         COMPM_D    MASK16,DROPLETS
  1709.         beq    move_down
  1710.         COMP_D    DIAMOND
  1711.         bne    test_rest30
  1712.         bsr    add_diamond
  1713.         bra    move_down
  1714. test_rest30    COMPM_D    MASK4,EXIT
  1715.         bne    test_rest31
  1716.         tst.b    enough_diamonds
  1717.         beq    stay
  1718.         st    found_exit
  1719.         bra    move_down
  1720. test_rest31    COMPM_D    MASK4,EXTRA_L
  1721.         bne    test_rest32a
  1722.         addq.w    #1,lives
  1723.         bsr    show_lives
  1724.         bra    move_down
  1725. test_rest32a    COMPM_D    MASK4,EXTRA_T
  1726.         bne    test_rest32
  1727.         add.w    #BONUS_SECS,time_left
  1728.         bra    move_down
  1729. test_rest32    COMPM_D    MASK4,NUMBER
  1730.         bne    test_rest33
  1731.         moveq    #3,d0
  1732.         and.b    COLUMNS(a1),d0
  1733.         mulu    #1000,d0
  1734.         add.l    d0,score
  1735.         bra    move_down
  1736. test_rest33    COMPM_D    MASK4,WATER_TAP
  1737.         bne    test_rest34
  1738.         st    water_taps_on
  1739.         bra    stay
  1740. test_rest34    COMPM_D    MASK4,FIRE_TAP
  1741.         bne    test_rest35
  1742.         st    fire_taps_on
  1743.         bra    stay
  1744. test_rest35    COMPM_D    MASK4,GEGG
  1745.         bne    test_rest36
  1746.         clr.w    gegg_timer
  1747.         bra    stay
  1748. test_rest36    COMPM_D    MASK4,BEGG
  1749.         bne    stay
  1750.         clr.w    begg_timer
  1751.         bra    stay
  1752.  
  1753. move_down    SETCHAR    MAN_D
  1754.         SET_D    MAN
  1755.         SETCEL    AIR
  1756.         addq.w    #1,rf_y
  1757.         bra    step_sound
  1758.  
  1759. stay        SETCEL    WMAN
  1760.         DONE
  1761.  
  1762. blast_cell    btst    #RIGHT,d0
  1763.         beq    nobl_right    
  1764.         COMPM_R    MASK2,AIR    ;(AIR or GRASS)
  1765.         beq    blast00
  1766.         COMPM_R    MASK16,DROPLETS    ;(DROPS & FIRE)
  1767.         beq    blast00
  1768.         COMP_R    DIAMOND
  1769.         bne    blast_rock0
  1770.         bsr    add_diamond
  1771.         bra    blast00
  1772. blast_rock0    COMPM_R    MASK8,ROCK    ;if pushing against ROCK + AIR,
  1773.         bne    noblasting
  1774.         COMP_RR    AIR
  1775.         bne    noblasting
  1776.         move.b    2(a1),d0    ;get rock frame #
  1777.         addq.b    #1,d0        ;animate rolling rock 
  1778.         moveq    #3,d1
  1779.         and.b    d1,d0
  1780.         or.b    #FROCK,d0
  1781.         SETR_RR    d0
  1782. blast00        SET_R    EXPL_AIR
  1783.         bra    blast_sound
  1784.  
  1785. nobl_right    btst    #LEFT,d0
  1786.         beq    nobl_left
  1787.         COMPM_L    MASK2,AIR
  1788.         beq    blast01
  1789.         COMPM_L    MASK16,DROPLETS
  1790.         beq    blast01
  1791.         COMP_L    DIAMOND
  1792.         bne    blast_rock1
  1793.         bsr    add_diamond
  1794.         bra    blast01
  1795. blast_rock1    COMPM_L    MASK8,ROCK
  1796.         bne    noblasting
  1797.         COMP_LL    AIR
  1798.         bne    noblasting
  1799.         move.b    -2(a1),d0
  1800.         subq.b    #1,d0
  1801.         moveq    #3,d1
  1802.         and.b    d1,d0
  1803.         or.b    #FROCK,d0
  1804.         SETR_LL    d0
  1805. blast01        SET_L    EXPL_AIR
  1806.         bra    blast_sound
  1807.  
  1808. nobl_left    btst    #UP,d0
  1809.         beq    nobl_up
  1810.         COMPM_U    MASK2,AIR
  1811.         beq    blast02
  1812.         COMPM_U    MASK16,DROPLETS
  1813.         beq    blast02
  1814.         COMP_U    DIAMOND
  1815.         bne    noblasting
  1816.         bsr    add_diamond
  1817. blast02        SET_U    EXPL_AIR
  1818.         bra    blast_sound
  1819.  
  1820. nobl_up        btst    #DOWN,d0
  1821.         beq    noblasting
  1822.         COMPM_D    MASK2,AIR
  1823.         beq    blast03
  1824.         COMPM_D    MASK16,DROPLETS
  1825.         beq    blast03
  1826.         COMP_D    DIAMOND
  1827.         bne    noblasting
  1828.         bsr    add_diamond
  1829. blast03        SET_D    EXPL_AIR
  1830.         bra    blast_sound
  1831.  
  1832. noblasting    DONE
  1833. ;---------------------------------------
  1834. step_sound    moveq    #1,d0
  1835.         not.b    one_two
  1836.         bne    step2
  1837.         moveq    #0,d0
  1838. step2        moveq    #2,d1
  1839. ;        
  1840.         DONE
  1841. ;---------------------------------------
  1842. blast_sound    moveq    #8,d0
  1843.         moveq    #2,d1
  1844. ;
  1845.         DONE
  1846. ;---------------------------------------
  1847. gegg        NEXCELL    MASK4,GEGG
  1848.         subq.w    #1,gegg_timer
  1849.         bpl.s    dont_hatch
  1850.         st    gsnake_struct+SNK_hatched
  1851.         SETCEL    GS_HEAD
  1852. dont_hatch    DONE
  1853. ;---------------------------------------
  1854. begg        NEXCELL    MASK4,BEGG
  1855.         subq.w    #1,begg_timer
  1856.         bpl.s    dont_hatch2
  1857.         st    bsnake_struct+SNK_hatched
  1858.         SETCEL    BS_HEAD
  1859. dont_hatch2    DONE
  1860. ;---------------------------------------
  1861. ;--------------- QUICK MUTATIONS
  1862. ;---------------------------------------
  1863. diam_bfly_1    SETCEL    EXPL_DIAM_BFLY+1
  1864.         DONE
  1865. ;---------------------------------------
  1866. diam_bfly_2    SETCEL    EXPL_DIAM_BFLY+2
  1867.         DONE
  1868. ;---------------------------------------
  1869. diam_bfly_3    SETCEL    EXPL_DIAM_BFLY+3
  1870.         DONE
  1871. ;---------------------------------------
  1872. diam_bfly_4    SETCEL    BUTTER_FLY
  1873.         DONE
  1874. ;---------------------------------------
  1875. bfly_diam_1    SETCEL    EXPL_BFLY_DIAM+1
  1876.         DONE
  1877. ;---------------------------------------
  1878. bfly_diam_2    SETCEL    EXPL_BFLY_DIAM+2
  1879.         DONE
  1880. ;---------------------------------------
  1881. bfly_diam_3    SETCEL    EXPL_BFLY_DIAM+3
  1882.         DONE
  1883. ;---------------------------------------
  1884. bfly_diam_4    SETCEL    DIAMOND
  1885.         DONE
  1886. ;---------------------------------------
  1887. rock_ffly_1    SETCEL    EXPL_ROCK_FFLY+1
  1888.         DONE
  1889. ;---------------------------------------
  1890. rock_ffly_2    SETCEL    EXPL_ROCK_FFLY+2
  1891.         DONE
  1892. ;---------------------------------------
  1893. rock_ffly_3    SETCEL    EXPL_ROCK_FFLY+3
  1894.         DONE
  1895. ;---------------------------------------
  1896. rock_ffly_4    SETCEL    FIRE_FLY
  1897.         DONE
  1898. ;---------------------------------------
  1899. ffly_air_1    SETCEL    EXPL_FFLY_AIR+1
  1900.         DONE
  1901. ;---------------------------------------
  1902. ffly_air_2    SETCEL    EXPL_FFLY_AIR+2
  1903.         DONE
  1904. ;---------------------------------------
  1905. ffly_air_3    SETCEL    EXPL_FFLY_AIR+3
  1906.         DONE
  1907. ;---------------------------------------
  1908. ffly_air_4    SETCEL    AIR
  1909.         DONE
  1910. ;---------------------------------------
  1911. air_expl_1    SETCEL    EXPL_AIR+1
  1912.         DONE
  1913. ;---------------------------------------
  1914. air_expl_2    SETCEL    AIR
  1915.         DONE
  1916. ;---------------------------------------
  1917. bonus_1        SETCEL    NUMBER+1
  1918.         DONE
  1919. ;---------------------------------------
  1920. bonus_2        SETCEL    NUMBER+2
  1921.         DONE
  1922. ;---------------------------------------
  1923. bonus_3        SETCEL    NUMBER+3
  1924.         DONE
  1925. ;---------------------------------------
  1926. bonus_4        SETCEL    NUMBER
  1927.         DONE
  1928. ;---------------------------------------
  1929. extra_t1    SETCEL    EXTRA_T+1
  1930.         DONE
  1931. ;---------------------------------------
  1932. extra_t2    SETCEL    EXTRA_T+2
  1933.         DONE
  1934. ;---------------------------------------
  1935. extra_t3    SETCEL    EXTRA_T+3
  1936.         DONE
  1937. ;---------------------------------------
  1938. extra_t4    SETCEL    EXTRA_T
  1939.         DONE
  1940. ;---------------------------------------
  1941. extra_l1    SETCEL    EXTRA_L+1
  1942.         DONE
  1943. ;---------------------------------------
  1944. extra_l2    SETCEL    EXTRA_L+2
  1945.         DONE
  1946. ;---------------------------------------
  1947. extra_l3    SETCEL    EXTRA_L+3
  1948.         DONE
  1949. ;---------------------------------------
  1950. extra_l4    SETCEL    EXTRA_L
  1951.         DONE
  1952. ;---------------------------------------
  1953. amib_rock_1    SETCEL    EXPL_AMIB_ROCK+1
  1954.         DONE
  1955. ;---------------------------------------
  1956. amib_rock_2    SETCEL    ROCK
  1957.         DONE
  1958. ;---------------------------------------
  1959. amib_diam_1    SETCEL    EXPL_AMIB_DIAM+1
  1960.         DONE
  1961. ;---------------------------------------
  1962. amib_diam_2    SETCEL    DIAMOND
  1963.         DONE
  1964. ;---------------------------------------
  1965. expl_drop1    moveq    #DROPS_SPEED>>1,d0
  1966.         and.w    anim_clock,d0
  1967.         bne    door_shut
  1968.         SETCEL    EXPL_DROP+1
  1969.         DONE
  1970. ;---------------------------------------
  1971. expl_drop2    moveq    #DROPS_SPEED>>1,d0
  1972.         and.w    anim_clock,d0
  1973.         bne    door_shut
  1974.         SETCEL    HR_DROP
  1975.         DONE
  1976. ;---------------------------------------
  1977. exit_1        tst.b    enough_diamonds
  1978.         beq    door_shut
  1979.         SETCEL    EXIT+1
  1980. door_shut    DONE
  1981. ;---------------------------------------
  1982. exit_2        SETCEL    EXIT+2
  1983.         DONE
  1984. ;---------------------------------------
  1985. exit_3        SETCEL    EXIT+3
  1986.         DONE
  1987. ;---------------------------------------
  1988. exit_4        SETCEL    EXIT
  1989.         DONE
  1990. ;---------------------------------------
  1991. ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
  1992. ;*-*-*-*-*-*-*-*-*-    SUPPORTING CELL    FUNCTIONS    *-*-*-*-*-
  1993. ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
  1994.  
  1995. touch_amiba1    move.w    #AMIBA,d1
  1996.         moveq    #MASK4,d2
  1997.         move.w    #EXPL_BFLY_DIAM,d3
  1998.         bra    red_hot
  1999. touch_amiba2    move.w    #AMIBA,d1
  2000.         moveq    #MASK4,d2
  2001.         move.w    #EXPL_FFLY_AIR,d3
  2002.         bra    red_hot
  2003. touch_ffly    move.w    #FIRE_FLY,d1
  2004.         moveq    #FFLY_MASK,d2
  2005.         move.w    #EXPL_FFLY_AIR,d3
  2006.         bra    red_hot
  2007. touch_bfly    move.w    #BUTTER_FLY,d1
  2008.         moveq    #BFLY_MASK,d2
  2009.         move.w    #EXPL_BFLY_DIAM,d3    ;fall through !
  2010. ;---------------------------------------
  2011. ; D1 = cell to TOUCH
  2012. ; D2 = explosion primer if touching
  2013.  
  2014. red_hot        CPMRR_U    d2,d1
  2015.         beq    explodeA
  2016.         CPMRR_R    d2,d1
  2017.         beq    explodeA
  2018.         CPMRR_D    d2,d1
  2019.         beq    explodeA
  2020.         CPMRR_L    d2,d1
  2021.         beq    explodeA
  2022.         rts
  2023. explodeA    move.w    d3,d0
  2024.         bra    explode
  2025. ;---------------------------------------
  2026. ; D0 = EXPLOSION PRIMER
  2027. ;  *! CHANGE compares to masked compares if necessary !!
  2028.  
  2029. SETEXPL        MACRO
  2030.         lea    \2(a1),a0
  2031.         move.b    (a0),d7
  2032.         cmp.b    d1,d7
  2033.         beq    \1
  2034.         moveq    #MASK4,d6    ;EXIT CONSISTS OF 4 CELLS
  2035.         and.w    d7,d6
  2036.         cmp.b    d2,d6
  2037.         beq    \1
  2038.         cmp.b    d3,d6        ;TAPS ARE 4 CELLS
  2039.         beq    \1
  2040.         cmp.b    d4,d6
  2041.         beq    \1
  2042.         move.b    d0,(a0)
  2043.         st    \2(a2)
  2044.         ENDM
  2045.  
  2046. explode_under    add.w    #COLUMNS,a1
  2047.         add.w    #COLUMNS,a2
  2048.  
  2049. explode        move.w    #RWALL,d1    ;set 3*3 square to explosion
  2050.         move.w    #EXIT,d2    ;primer except for indestr. cells
  2051.         move.w    #WATER_TAP,d3
  2052.         move.w    #FIRE_TAP,d4
  2053.  
  2054.         SETEXPL    leave00,-COLUMNS-1    ;UL    
  2055. leave00        SETEXPL    leave01,-COLUMNS    ;U
  2056. leave01        SETEXPL    leave02,-COLUMNS+1    ;UR
  2057. leave02        SETEXPL    leave03,1        ;R
  2058. leave03        SETEXPL    leave04,COLUMNS+1    ;DR
  2059. leave04        SETEXPL    leave05,COLUMNS        ;D
  2060. leave05        SETEXPL    leave06,COLUMNS-1    ;DL
  2061. leave06        SETEXPL    leave07,-1        ;L
  2062. leave07        SETEXPL    leave08,0        ;C
  2063. leave08        tst.l    (SP)+        ;pop a level
  2064.         move.l    a6,-(SP)
  2065.         moveq    #4,d0
  2066.         moveq    #0,d1        ;same as bonk
  2067. ;
  2068.         move.l    (SP)+,a6
  2069.         DONE
  2070. ;---------------------------------------
  2071. add_diamond    move.l    price,d0
  2072.         add.l    d0,score
  2073.         subq.w    #1,diamonds
  2074.         moveq    #5,d0
  2075.         moveq    #3,d1
  2076. ;
  2077.         rts
  2078. ;---------------------------------------
  2079. ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*--
  2080. ;---------------------------------------
  2081. gsnake_cells    dc.b    GS_HEAD+0,GS_HEAD+2,GS_HEAD+4,GS_HEAD+6
  2082.         dc.b    GS_SEGM+0,GS_SEGM+2,GS_SEGM+4,GS_SEGM+6
  2083.         dc.b    GS_TAIL+0,GS_TAIL+2,GS_TAIL+4,GS_TAIL+6
  2084.  
  2085. bsnake_cells    dc.b    BS_HEAD+0,BS_HEAD+2,BS_HEAD+4,BS_HEAD+6
  2086.         dc.b    BS_SEGM+0,BS_SEGM+2,BS_SEGM+4,BS_SEGM+6
  2087.         dc.b    BS_TAIL+0,BS_TAIL+2,BS_TAIL+4,BS_TAIL+6
  2088.  
  2089. init_snakes    move.w    #GEGG,d0
  2090.         bsr    find_cell
  2091.         spl    good_snake
  2092.         bmi.s    scan_for_bad
  2093.         move.l    a0,gsnake_struct+SNK_segm_ptrs
  2094.         lea    gsnake_struct,a0
  2095.         clr.w    SNK_head_index(a0)
  2096.         move.b    #EXPL_AMIB_DIAM,SNK_turn_rocks_into(a0)
  2097.         move.b    #1,SNK_length(a0)
  2098.         clr.l    SNK_dir_codes(a0)        ;all facing UP
  2099.         clr.l    SNK_dir_codes+4(a0)
  2100.         sf    SNK_hatched(a0)
  2101.         lea    gsnake_cells,a1
  2102.         bsr    copy_snake_cells
  2103.         move.w    #G_HATCH_TIME,gegg_timer
  2104.  
  2105. scan_for_bad    move.w    #BEGG,d0
  2106.         bsr    find_cell
  2107.         spl    bad_snake
  2108.         bmi.s    no_bad_snake
  2109.         move.l    a0,bsnake_struct+SNK_segm_ptrs
  2110.         lea    bsnake_struct,a0
  2111.         clr.w    SNK_head_index(a0)
  2112.         move.b    #EXPL_ROCK_FFLY,SNK_turn_rocks_into(a0)
  2113.         move.b    #1,SNK_length(a0)
  2114.         clr.l    SNK_dir_codes(a0)
  2115.         clr.l    SNK_dir_codes+4(a0)
  2116.         sf    SNK_hatched(a0)
  2117.         lea    bsnake_cells,a1
  2118.         bsr    copy_snake_cells
  2119.         move.w    #B_HATCH_TIME,begg_timer
  2120. no_bad_snake    rts
  2121. ;---------------------------------------
  2122. copy_snake_cells lea    SNK_head_codes(a0),a2
  2123.         moveq    #3*4-1,d0
  2124. copy_sncells    move.b    (a1)+,(a2)+
  2125.         dbra    d0,copy_sncells
  2126.         rts
  2127. ;---------------------------------------
  2128. init_divu_table    move.l    divu_table,a0
  2129.         moveq    #0,d7
  2130. gen_divtab    move.l    d7,d0
  2131.         divu    #20,d0
  2132.         move.l    d0,(a0)+
  2133.         addq.w    #1,d7
  2134.         cmp.w    #256,d7
  2135.         bne    gen_divtab
  2136.         rts
  2137. ;---------------------------------------
  2138. show_lives    rts
  2139. ;---------------------------------------
  2140. add_secs_left    bra    while_secs
  2141. time_bonus    moveq    #3,d0
  2142.         and.l    score,d0
  2143.         bne    no_tock
  2144.         moveq    #7,d0
  2145.         moveq    #1,d1
  2146.         not.b    one_two
  2147.         bne    tick2
  2148.         moveq    #6,d0
  2149.         moveq    #0,d1        
  2150. tick2        NOP
  2151. ;
  2152.  
  2153. no_tock        addq.l    #1,score
  2154.         bsr    update_score
  2155.         bsr    update_time
  2156.         move.l    #7000,d0
  2157.         bsr    delay
  2158. while_secs    tst.w    time_left
  2159.         bne    time_bonus
  2160.         rts
  2161. ;---------------------------------------
  2162. find_rf        move.w    #MAN,d0
  2163.         bsr    find_cell
  2164.         bmi.s    no_man
  2165.         movem.w    d0/d1,rf_x
  2166.         rts
  2167. no_man        clr.l    rf_x        ;& rf_y
  2168.         rts
  2169. ;---------------------------------------
  2170. count_amibas    move.w    #AMIBA,d0
  2171.         bsr    count_cells
  2172.         move.w    d1,amiba_count
  2173.         rts
  2174. ;---------------------------------------
  2175. ; D0 = cells to count        returns in D1
  2176.  
  2177. count_cells    lea    cell_map,a0
  2178.         clr.w    d1        ;clear count
  2179.         move.w    #MAP_SIZE-1,d2
  2180. count_loop    cmp.b    (a0)+,d0
  2181.         dbeq    d2,count_loop
  2182.         bne    map_scanned
  2183.         addq.w    #1,d1
  2184.         subq.w    #1,d2
  2185.         bpl.s    count_loop
  2186. map_scanned    rts
  2187. ;---------------------------------------
  2188. ; D0 = cell to find    BMI for not found
  2189.  
  2190. find_cell    lea    cell_map,a0
  2191.         move.l    a0,a1
  2192.         move.w    #MAP_SIZE-1,d2
  2193. search_cell    cmp.b    (a1)+,d0
  2194.         dbeq    d2,search_cell
  2195.         bne    not_found
  2196.         subq.w    #1,a1
  2197.         move.l    a1,-(SP)
  2198.         suba.l    a0,a1
  2199.         move.l    a1,d1
  2200.         move.l    (SP)+,a0
  2201.         divu    #COLUMNS,d1
  2202.         move.l    d1,d0
  2203.         swap    d0
  2204.         rts
  2205. not_found    moveq    #-1,d0        ;MINUS for error
  2206.         rts
  2207. ;---------------------------------------
  2208. ; D0 = general code
  2209. ; D1 = replace cell
  2210. ; D2 = mask
  2211.  
  2212. replace_cells    lea    cell_map,a0
  2213.         move.w    #MAP_SIZE-1,d3
  2214. look_for_cells    move.b    (a0),d4
  2215.         and.b    d2,d4
  2216.         cmp.b    d0,d4
  2217.         beq    change_cell
  2218.         addq.w    #1,a0
  2219.         dbra    d3,look_for_cells
  2220.         rts
  2221. change_cell    move.b    d1,(a0)+
  2222.         subq.w    #1,d3
  2223.         bpl.s    look_for_cells
  2224. none_found    rts
  2225. ;---------------------------------------
  2226. open_libraries    movea.l    4.w,a6
  2227.         lea    intui_name,a1
  2228.         moveq    #0,d0
  2229.         EXEC    OpenLibrary
  2230.         move.l    d0,INTUI_LIB_PTR
  2231.  
  2232.         lea    gfx_name,a1
  2233.         moveq    #0,d0
  2234.         EXEC    OpenLibrary
  2235.         move.l    d0,GFX_LIB_PTR
  2236.  
  2237.         lea    dos_name,a1
  2238.         moveq    #0,d0
  2239.         EXEC    OpenLibrary
  2240.         move.l    d0,DOS_LIB_PTR
  2241.         rts    
  2242. ;---------------------------------------
  2243. close_libraries    move.l    4.w,a6
  2244.  
  2245.         move.l    INTUI_LIB_PTR,a1
  2246.         EXEC    CloseLibrary
  2247.  
  2248.         move.l    GFX_LIB_PTR,a1
  2249.         EXEC    CloseLibrary
  2250.  
  2251.         move.l    DOS_LIB_PTR,a1
  2252.         EXEC    CloseLibrary
  2253.         rts
  2254. ;---------------------------------------
  2255. open_screen    move.l    INTUI_LIB_PTR,a6
  2256.         lea    rocky_screendef,a0
  2257.         INTUI    OpenScreen
  2258.  
  2259.         move.l    d0,myscreen
  2260.         move.l    d0,window_screen
  2261.         move.l    d0,a0
  2262.         lea    sc_ViewPort(a0),a1
  2263.         move.l    a1,myviewport
  2264.         lea    sc_RastPort(a0),a1
  2265.         move.l    a1,myrastport
  2266.         lea    184(a0),a1
  2267.         move.l    a1,mybitmap
  2268.  
  2269.         addq.w    #8,a1            ;goto bm_Planes
  2270.         move.l    a1,plane_ptrs
  2271.         lea    screen_base,a3
  2272.         moveq    #PLANES-1,d0
  2273.  
  2274. set_scrptrs    move.l    (a1)+,a2        ;get Intui Plane ptr
  2275.         add.w    #20*SCREEN_WIDTH,a2    ;add offset to playfield
  2276.         move.l    a2,(a3)+        ;store
  2277.         dbra    d0,set_scrptrs
  2278.  
  2279.         move.l    myviewport,a0
  2280.         lea    screen_colors,a1
  2281.         moveq    #8,d0
  2282.         move.l    GFX_LIB_PTR,a6
  2283.         GFX    LoadRGB4        ;set screen colors
  2284.  
  2285. open_window    move.l    INTUI_LIB_PTR,a6
  2286.         lea    windowdef,a0
  2287.         INTUI    OpenWindow
  2288.         move.l    d0,mywindow
  2289.         move.l    d0,a0
  2290.         move.l    wd_UserPort(a0),mymsgport
  2291.         move.l    mymsgport,a0
  2292.         move.b    MP_SIGBIT(a0),d0
  2293.         moveq    #1,d1
  2294.         lsl.l    d0,d1
  2295.         move.l    d1,waitmask
  2296.         rts
  2297. ;---------------------------------------
  2298. close_screen    move.l    INTUI_LIB_PTR,a6
  2299.         move.l    mywindow,a0
  2300.         INTUI    CloseWindow
  2301.  
  2302.         move.l    myscreen,a0
  2303.         INTUI    CloseScreen
  2304.         rts
  2305. ;---------------------------------------
  2306. test_IDCMP    move.l    4.w,a6
  2307.         move.l    mymsgport,a0
  2308.         EXEC    GetMsg        ;see if Intuition
  2309.         tst.l    d0            ;sent us a msg
  2310.         beq    dummy
  2311.  
  2312.         move.l    d0,a1
  2313.         move.l    im_Class(a1),imsg_class        ;copy relevant info
  2314.         move.w    im_Code(a1),imsg_code
  2315.         move.l    im_IAddress(a1),imsg_addr
  2316.         move.l    im_MouseX(a1),imsg_ratcords
  2317.         EXEC    ReplyMsg            ;and return msg
  2318.         move.l    imsg_class,d0
  2319.         lea    event_routines,a0
  2320.         bra    scan_types
  2321. possible_event    move.l    (a0)+,a1
  2322.         cmp.l    d0,d1
  2323.  
  2324.         bne    scan_types
  2325.         jmp    (a1)            ;execute event handler
  2326.  
  2327. scan_types    move.l    (a0)+,d1
  2328.         bpl.s    possible_event
  2329.         rts
  2330.  
  2331. event_routines    dc.l    VANILLAKEY,keypress
  2332.         dc.l    -1
  2333.  
  2334. *        dc.l    RAWKEY,keypress
  2335. *        dc.l    GADGETUP,intui_gadget
  2336. *        dc.l    MOUSEBUTTONS,gadget_press
  2337. *        dc.l    CLOSEWINDOW,quit_me
  2338.  
  2339. ;---------------------------------------
  2340. ; Here we insert a DOS delay loop depending on which machine/config we're running on.
  2341. ;---------------------------------------
  2342.  
  2343. tune_game_speed    move.l    4.w,a6        ; -> Exec structure
  2344.         move.w    AttnFlags(a6),d0 ;what kind of processor is this ?
  2345.         beq    need_the_juice    ;if plain old 68000 then don't delay at all !!!
  2346.         
  2347.         btst    #AFB_68040,d0    ;040 based Amiga ?
  2348.         beq    not_040
  2349.         moveq    #6,d1        ;.... I guess
  2350.         bra    delay_game
  2351.  
  2352. not_040        btst    #AFB_68030,d0    ;030 based Amiga ?
  2353.         beq    not_030
  2354.         moveq    #3,d1        ;for a 25Mhz A3000 (coz that's what I've got)
  2355.         bra    delay_game
  2356.  
  2357. not_030        btst    #AFB_68020,d0
  2358.         beq    need_the_juice
  2359.         moveq    #1,d1        ;.... I guess
  2360.  
  2361. delay_game    move.l    DOS_LIB_PTR,a6    ;slow down game a bit... depending on CPU
  2362.         DOS    Delay
  2363.  
  2364. need_the_juice    rts
  2365. ;---------------------------------------
  2366. keypress    move.b    imsg_code+1,keyval
  2367.         rts
  2368. ;---------------------------------------
  2369. CELL_NUMS    dc.w    $8000+0    AIR    0    ;CODES 00..1F
  2370.         dc.w    $8000+1    GRASS    1    ;ARE RESERVED FOR
  2371.         dc.w    $8000+2    RWALL    2    ;PERSPECTIVE CELLS
  2372.         dc.w    $8000+4    WALL 1    3    ;ONLY !!!!!!!!!!!!
  2373.  
  2374.         dc.w    $8000+4    EWALL    4
  2375.         dc.w    $8000+5        5
  2376.         dc.w    $8000+6        6
  2377.         dc.w    $8000+7        7
  2378.  
  2379.         dc.w    $8000+4    GWALL    8
  2380.         dc.w    $8000+0        9
  2381.         dc.w    $8000+0        A
  2382.         dc.w    $8000+0        B
  2383.  
  2384.         dc.w    $8000+12 FWALL    C
  2385.         dc.w    $8000+13    D
  2386.         dc.w    $8000+14    E
  2387.         dc.w    $8000+15    F
  2388. ;- - - - - - -
  2389.         dc.w    120    AMIBA    10
  2390.         dc.w    121        11
  2391.         dc.w    122        12
  2392.         dc.w    123        13
  2393.         dc.w    0        14
  2394.         dc.w    0        15
  2395.         dc.w    0        16
  2396.         dc.w    0        17
  2397.         dc.w    0        18
  2398.         dc.w    0        19
  2399.         dc.w    0        1A
  2400.         dc.w    0        1B
  2401.         dc.w    0        1C
  2402.         dc.w    0        1D
  2403.         dc.w    0        1E
  2404.         dc.w    0        1F
  2405.  
  2406. man_char    dc.w    2    MAN    20
  2407.         dc.w    0        21
  2408.         dc.w    0        22
  2409.         dc.w    0        23
  2410.  
  2411. wman_char    dc.w    8    WMAN    24
  2412.         dc.w    0        25
  2413.         dc.w    0        26
  2414.         dc.w    0        27
  2415.  
  2416.         dc.w    20    ROCK    28
  2417.         dc.w    0        29
  2418.         dc.w    0        2A
  2419.         dc.w    0        2B
  2420.         dc.w    20    FROCK    2C
  2421.         dc.w    21    FROCK    2D
  2422.         dc.w    22    FROCK    2E
  2423.         dc.w    23    FROCK    2F
  2424.  
  2425.         dc.w    24    BUTFLY_UP    30
  2426.         dc.w    26    BUTFLY_RIGHT    31
  2427.         dc.w    28    BUTFLY_DOWN    32
  2428.         dc.w    30    BUTFLY_LEFT    33
  2429.  
  2430.         dc.w    35    FLY_UP        34
  2431.         dc.w    34    FLY_RIGHT    35
  2432.         dc.w    33    FLY_DOWN    36
  2433.         dc.w    32    FLY_LEFT    37
  2434.  
  2435.         dc.w    36    FIRE_TAP 38
  2436.         dc.w    37        39
  2437.         dc.w    38        3A
  2438.         dc.w    39        3B
  2439.  
  2440.         dc.w    34    FLIES    3C
  2441.         dc.w    33        3D
  2442.         dc.w    32        3E
  2443.         dc.w    35        3F
  2444.  
  2445.         dc.w    136    BFLY_DIAM_EXPL    40
  2446.         dc.w    137    ''    41
  2447.         dc.w    138    ''    42
  2448.         dc.w    139    ''    43
  2449.  
  2450.         dc.w    152    ROCK_FFLY_EXPL    44
  2451.         dc.w    153    ''    45
  2452.         dc.w    154    ''    46
  2453.         dc.w    155    ''    47
  2454.  
  2455.         dc.w    132    FFLY_AIR_EXPL    48
  2456.         dc.w    133    ''    49
  2457.         dc.w    134    ''    4A
  2458.         dc.w    135    ''    4B
  2459.  
  2460.         dc.w    134    EXPL_AIR    4C
  2461.         dc.w    135    ''    4D
  2462.         dc.w    138    AMIB_DIAM    4E
  2463.         dc.w    139    ''    4F
  2464.  
  2465.         dc.w    174    AMIB_ROCK    50
  2466.         dc.w    175    ''    51
  2467.         dc.w    0        52
  2468.         dc.w    0        53
  2469.         
  2470.         dc.w    139    DIAM_BFLY    54
  2471.         dc.w    138    ''    55
  2472.         dc.w    137    ''    56
  2473.         dc.w    136    ''    57
  2474.  
  2475.         dc.w    0,0,0,0        58
  2476.         dc.w    0,0,0,0        5C
  2477.  
  2478.         dc.w    80    FALLING_DROP 60
  2479.         dc.w    81    ''
  2480.         dc.w    84    HR_DROP    62
  2481.         dc.w    85    ''    63
  2482.  
  2483.         dc.w    86    HL_DROP 64
  2484.         dc.w    87    ''    65
  2485.         dc.w    82    EXPL_DROP 66
  2486.         dc.w    83    ''    67
  2487.  
  2488.         dc.w    88    FLAME    68
  2489.         dc.w    89    ''    69
  2490.         dc.w    90    HR_FLAME 6A
  2491.         dc.w    91    ''    6B
  2492.  
  2493.         dc.w    90    HL_FLAME 6C
  2494.         dc.w    91    ''    6D
  2495.         dc.w    0        6E
  2496.         dc.w    0        6F
  2497.  
  2498.         dc.w    112    BEGG    70
  2499.         dc.w    113        71
  2500.         dc.w    114        72
  2501.         dc.w    115        73
  2502.  
  2503.         dc.w    92    EXIT    74
  2504.         dc.w    93        75
  2505.         dc.w    94        76
  2506.         dc.w    95        77
  2507.  
  2508.         dc.w    100    NUMBER    78
  2509.         dc.w    101        79
  2510.         dc.w    102        7A
  2511.         dc.w    103        7B
  2512.  
  2513.         dc.w    104    EXTRA_T    7C
  2514.         dc.w    105        7D
  2515.         dc.w    106        7E
  2516.         dc.w    107        7F
  2517.  
  2518.         dc.w    108    EXTRA_L    80
  2519.         dc.w    109        81
  2520.         dc.w    110        82
  2521.         dc.w    111        83
  2522.  
  2523.         dc.w    96    GEGG    84
  2524.         dc.w    97        85
  2525.         dc.w    98        86
  2526.         dc.w    99        87
  2527.  
  2528.         dc.w    116    DIAMOND    88
  2529.         dc.w    0        89
  2530.         dc.w    0        8A
  2531.         dc.w    0        8B
  2532.         dc.w    116    FDIAMOND 8C
  2533.         dc.w    0        8D
  2534.         dc.w    0        8E
  2535.         dc.w    0        8F
  2536.  
  2537.         dc.w    40    GS_HEAD    90    U
  2538.         dc.w    41        91    U
  2539.         dc.w    42        92    R
  2540.         dc.w    43        93    R
  2541.  
  2542.         dc.w    44        94    D
  2543.         dc.w    45        95    D
  2544.         dc.w    46        96    L
  2545.         dc.w    47        97    L
  2546.  
  2547.         dc.w    56    GS_SEGM    98
  2548.         dc.w    57        99
  2549.         dc.w    58        9A
  2550.         dc.w    59        9B
  2551.  
  2552.         dc.w    56        9C
  2553.         dc.w    57        9D
  2554.         dc.w    58        9E
  2555.         dc.w    59        9F
  2556.  
  2557.         dc.w    48     GS_TAIL    A0
  2558.         dc.w    49         A1
  2559.         dc.w    50         A2
  2560.         dc.w    51         A3
  2561.  
  2562.         dc.w    52        A4
  2563.         dc.w    53         A5
  2564.         dc.w    54         A6
  2565.         dc.w    55         A7
  2566.  
  2567.         dc.w    0        A8
  2568.         dc.w    0        A9
  2569.         dc.w    0        AA
  2570.         dc.w    0        AB
  2571.  
  2572.         dc.w    0        AC
  2573.         dc.w    0        AD
  2574.         dc.w    0        AE
  2575.         dc.w    0        AF
  2576.  
  2577.         dc.w    25 BUTTERFLIES    B0    $30+$80
  2578.         dc.w    27        B1
  2579.         dc.w    29        B2
  2580.         dc.w    31        B3
  2581.  
  2582.         dc.w    33 FLIES    B4
  2583.         dc.w    32        B5
  2584.         dc.w    35        B6
  2585.         dc.w    34        B7
  2586.  
  2587.         dc.w    0        B8
  2588.         dc.w    0        B9
  2589.         dc.w    0        BA
  2590.         dc.w    0        BB
  2591.  
  2592.         dc.w    32 FLIES    BC
  2593.         dc.w    35        BD
  2594.         dc.w    34        BE
  2595.         dc.w    33        BF
  2596.  
  2597.         dc.w    0        C0
  2598.         dc.w    0        C1
  2599.         dc.w    0        C2
  2600.         dc.w    0        C3
  2601.  
  2602.         dc.w    176    WATER_TAP C4
  2603.         dc.w    177        C5
  2604.         dc.w    178        C6
  2605.         dc.w    179        C7
  2606.  
  2607.         dc.w    0        C8
  2608.         dc.w    0        C9
  2609.         dc.w    0        CA
  2610.         dc.w    0        CB
  2611.  
  2612.         dc.w    0        CC
  2613.         dc.w    0        CD
  2614.         dc.w    0        CE
  2615.         dc.w    0        CF
  2616.  
  2617.         dc.w    60 BS_HEAD    D0    U
  2618.         dc.w    61        D1    U
  2619.         dc.w    62        D2    R
  2620.         dc.w    63        D3    R
  2621.  
  2622.         dc.w    64        D4    D
  2623.         dc.w    65        D5    D
  2624.         dc.w    66        D6    L
  2625.         dc.w    67        D7    L
  2626.  
  2627.         dc.w    76 BS_SEGM    D8
  2628.         dc.w    77        D9
  2629.         dc.w    78        DA
  2630.         dc.w    79        DB
  2631.  
  2632.         dc.w    76        DC
  2633.         dc.w    77        DD
  2634.         dc.w    78        DE
  2635.         dc.w    79        DF
  2636.  
  2637.         dc.w    68 BS_TAIL    E0
  2638.         dc.w    69        E1
  2639.         dc.w    70        E2
  2640.         dc.w    71        E3
  2641.  
  2642.         dc.w    72        E4
  2643.         dc.w    73        E5
  2644.         dc.w    74        E6
  2645.         dc.w    75        E7
  2646.  
  2647.         dc.w    0,0,0,0,0,0,0,0 E8
  2648.         dc.w    0,0,0,0,0,0,0,0 F0
  2649.         dc.w    0,0,0,0,0,0,0,0 F8
  2650. ;---------------------------------------
  2651. animate_things    addq.w    #1,anim_clock    ;tick animation phases clock
  2652.  
  2653.         tst.b    found_exit
  2654.         bne    arrived
  2655.         moveq    #4,d1
  2656.         bsr    rnd
  2657.         add.w    #12,d0
  2658.         move.w    d0,wman_char
  2659.         bra    done_waiting
  2660.  
  2661. arrived        moveq    #3,d0
  2662.         and.w    anim_clock,d0
  2663.         add.w    #16,d0
  2664.         move.w    d0,man_char
  2665. done_waiting    rts
  2666. ;---------------------------------------
  2667. new_game    bsr    copy_map
  2668.         bsr    init_game_vars
  2669.         bsr    init_panel
  2670.         rts
  2671. ;---------------------------------------
  2672. init_game_vars    bsr    find_rf        ;set rf_x,rf_y
  2673.         bsr    init_snakes
  2674.         bsr    count_amibas
  2675.  
  2676.         move.b    #PUSH,energy    ;for pushing
  2677.         move.b    #AFTER_LIFE,death_count    ;for life without rf
  2678.  
  2679.         sf    found_exit
  2680.         sf    out_of_time
  2681.         sf    enough_diamonds
  2682.         sf    magic_walls
  2683.         sf    water_taps_on
  2684.         sf    fire_taps_on
  2685.         sf    disable_rockf
  2686.  
  2687.         move.w    level,d0
  2688.         lsr.w    #2,d0
  2689.         move.w    d0,world        ;4 levels per world
  2690.  
  2691.         mulu    #WORLD_sizeof,d0
  2692.         lea    world_descriptors,a0
  2693.         add.l    d0,a0
  2694.         move.l    a0,world_ptr
  2695.         moveq    #3,d1
  2696.         and.w    level,d1
  2697.         add.w    d1,d1
  2698.         move.w    to_collect(a0,d1),diamonds
  2699.         move.w    time_lefts(a0,d1),time_left
  2700.         addq.w    #1,time_left
  2701.         add.w    d1,d1                ;D1 into LONGs
  2702.         move.l    jewel_value(a0,d1),price
  2703.  
  2704.         lea    score_field,a0
  2705.         moveq    #6-1,d0
  2706. reset_score    move.b    #'0',(a0)+
  2707.         dbra    d0,reset_score
  2708.         rts
  2709. ;---------------------------------------
  2710. init_panel    lea    jewel_name,a0
  2711.         moveq    #0,d0        ;char column
  2712.         moveq    #10,d1        ;scan line
  2713.         moveq    #4,d3        ;string len
  2714.         bsr    print_string
  2715.  
  2716.         moveq    #0,d0        ;fill in level # field
  2717.         move.w    level,d0
  2718.         addq.w    #1,d0
  2719.         moveq    #2,d1        ;01..40
  2720.         lea    level_num,a0
  2721.         bsr    bin_to_dec
  2722.  
  2723.         lea    level_string,a0
  2724.         moveq    #30,d0        ;char column
  2725.         moveq    #10,d1        ;scan line
  2726.         moveq    #8,d3        ;string len
  2727.         bsr    print_string
  2728.  
  2729.         bsr    update_time
  2730.  
  2731. ;- - - - - - - -------------------------
  2732. update_panel    move.w    diamonds,d0    ;get # of diamonds
  2733.         ext.l    d0
  2734.         bpl.s    positive_ok
  2735.         moveq    #0,d0        ;if neg, clip to zero
  2736. positive_ok    moveq    #3,d1        ;need 3 chars
  2737.         lea    diam_string,a0
  2738.         bsr    bin_to_dec    ;convert to string
  2739.         
  2740.         lea    diam_string,a0
  2741.         moveq    #5,d0        ;column
  2742.         moveq    #10,d1        ;line
  2743.         moveq    #3,d3        ;string len
  2744.         bsr    print_string    ;print on status strip
  2745.  
  2746. update_score    move.l    score,d0    ;convert score to string
  2747.         moveq    #6,d1        ;6 chars
  2748.         lea    score_field,a0
  2749.         bsr    bin_to_dec
  2750.         
  2751.         lea    score_string,a0    ;print score string
  2752.         moveq    #10,d0        ;column xco
  2753.         moveq    #10,d1        ;pix yco 
  2754.         moveq    #13,d3        ;string length
  2755.         bsr    print_string
  2756.         rts
  2757. ;---------------------------------------
  2758. update_time    tst.w    time_left
  2759.         beq    time_out
  2760.         subq.w    #1,time_left
  2761.         seq    out_of_time
  2762.  
  2763.         moveq    #0,d0
  2764.         move.w    time_left,d0
  2765.         moveq    #3,d1
  2766.         lea    time_string,a0
  2767.         bsr    bin_to_dec
  2768.  
  2769.         lea    time_string,a0
  2770.         moveq    #25,d0
  2771.         moveq    #10,d1
  2772.         moveq    #3,d3
  2773.         bsr    print_string
  2774.  
  2775. time_out    rts
  2776. ;---------------------------------------
  2777. copy_map    move.l    maps,a0
  2778.         lea    cell_map,a1
  2779.         move.w    #(MAP_SIZE/4)-1,d0
  2780. copy_map_l    move.l    (a0)+,(a1)+
  2781.         dbra    d0,copy_map_l
  2782.         rts
  2783. ;---------------------------------------
  2784. get_key        moveq    #0,d0
  2785.         move.b    keyval,d0
  2786.         clr.b    keyval
  2787.         rts
  2788. ;---------------------------------------
  2789. track_time    tst.b    pauze
  2790.         bne    game_irqs_done
  2791.         move.l    INTUI_LIB_PTR,a0    ;see if a second expired
  2792.         move.l    ib_Seconds(a0),d0
  2793.         cmp.l    time,d0
  2794.         beq    enough_time
  2795.  
  2796.         move.l    d0,time            ;if so,
  2797.         bsr    update_time        ;show on panel
  2798.  
  2799.         move.w    time_left,d1
  2800.         beq    enough_time
  2801.         moveq    #10,d0
  2802.         sub.w    d1,d0
  2803.         bmi.s    enough_time
  2804.         tst.b    found_exit
  2805.         bne    enough_time
  2806.         NOP                ;time running out sound!
  2807.  
  2808. enough_time    
  2809. game_irqs_done    rts
  2810. ;---------------------------------------
  2811. redraw_screen    lea    cell_map+MAP_SIZE,a6    ;new cell #
  2812.         lea    CELL_NUMS,a5
  2813.         move.l    divu_table,a4
  2814.         move.w    #21*8*SCREEN_WIDTH+39,d5 ;screen offset
  2815.         moveq    #ROWS-1,d7        ;line 21..0
  2816. next_line0    moveq    #COLUMNS-1,d6        ;column 39..0
  2817. next_column0    BSR    draw_cell
  2818.         subq.w    #1,d5            ;move left->right
  2819.         dbra    d6,next_column0
  2820.         sub.w    #7*SCREEN_WIDTH,d5    ;move down->up
  2821.         dbra    d7,next_line0
  2822.         rts
  2823. ;---------------------------------------
  2824. CP_CHAR        MACRO
  2825.         move.b    (a0),(a1)
  2826.         move.b    1*SCREEN_WIDTH(a0),1*SCREEN_WIDTH(a1)
  2827.         move.b    2*SCREEN_WIDTH(a0),2*SCREEN_WIDTH(a1)
  2828.         move.b    3*SCREEN_WIDTH(a0),3*SCREEN_WIDTH(a1)
  2829.         move.b    4*SCREEN_WIDTH(a0),4*SCREEN_WIDTH(a1)
  2830.         move.b    5*SCREEN_WIDTH(a0),5*SCREEN_WIDTH(a1)
  2831.         move.b    6*SCREEN_WIDTH(a0),6*SCREEN_WIDTH(a1)
  2832.         move.b    7*SCREEN_WIDTH(a0),7*SCREEN_WIDTH(a1)
  2833.         ENDM
  2834.  
  2835. ; A6 -> new CELL in map
  2836.  
  2837. draw_cell    moveq    #0,d0
  2838.         move.b    -(a6),d0        ;get cell
  2839.         add.w    d0,d0
  2840.         move.w    0(a5,d0),d0        ;cell # >> char #
  2841.         bmi.s    perspective_cell
  2842.         add.w    #20,d0        ;if normal cell: offset to next line
  2843. perspective_cell
  2844.         and.w    #255,d0        ;mask of cell #
  2845.         add.w    d0,d0
  2846.         add.w    d0,d0
  2847.         move.l    0(a4,d0.w),d0    ;get char position in src screen
  2848.         move.l    d0,d1
  2849.         mulu    #8*SCREEN_WIDTH,d0
  2850.         swap    d1
  2851.         add.w    d1,d0
  2852.         move.l    char_graphics,a0
  2853.         add.w    d0,a0
  2854.  
  2855.         move.l    screen_base,a1
  2856.         add.w    d5,a1
  2857.         CP_CHAR
  2858.  
  2859.         add.w    #8000,a0
  2860.         move.l    screen_base+4,a1
  2861.         add.w    d5,a1
  2862.         CP_CHAR
  2863.  
  2864.         add.w    #8000,a0
  2865.         move.l    screen_base+8,a1
  2866.         add.w    d5,a1
  2867.         CP_CHAR
  2868.         rts
  2869. ;---------------------------------------
  2870. ; D1 = X  // D2 = Y        ;USES D0,D1,D2  A0,A1,A6
  2871. ; D3 = string length
  2872. ; A0-> 'C'-type string
  2873.  
  2874. print_string    move.l    a0,-(SP)        ;save string ptr
  2875.         move.l    GFX_LIB_PTR,a6
  2876.         asl.w    #3,d0            ;char column -> pix x
  2877.         addq.w    #7,d1            ;cvt to baseline Y
  2878.         move.l    myrastport,a1
  2879.         GFX    Move
  2880.  
  2881.         moveq    #1,d0            ;use color N
  2882.         move.l    myrastport,a1
  2883.         GFX    SetAPen
  2884.  
  2885.         move.l    (SP)+,a0        ;retrieve string ptr
  2886.         move.w    d3,d0            ;set string len
  2887.         move.l    myrastport,a1
  2888.         GFX    Text
  2889.         rts
  2890. ;---------------------------------------
  2891. ; D0=# of stick        ;delivers C64 values
  2892.  
  2893. read_stick    movem.l    d7/a0,-(SP)
  2894.         lea    CUSTOM_BASE,a0
  2895.         and.w    #1,d0        ;stick #1 or #2 ,nothing else
  2896.         move.w    d0,d7        ;save which joystick
  2897.         add.w    d0,d0
  2898.         move.w    joy0dat(A0,d0.w),d1    ;get status
  2899.         moveq    #0,d0        ;clear C64 joyval
  2900.  
  2901. always_stick    btst    #1,d1        ;decode bits
  2902.         beq    _not_right
  2903.         bset    #RIGHT,d0   ;set RIGHT bit in D0 (like in the C64 !)
  2904.         bchg    #0,d1
  2905. _not_right    btst    #9,d1
  2906.         beq    _not_left
  2907.         bset    #LEFT,d0
  2908.         bchg    #8,d1
  2909. _not_left    btst    #8,d1
  2910.         beq    _not_forw
  2911.         bset    #UP,d0
  2912. _not_forw    btst    #0,d1
  2913.         beq    _not_back
  2914.         bset    #DOWN,d0
  2915.  
  2916. _not_back    addq.w    #6,d7
  2917.         btst    d7,FIRE_BUTTONS    ;test this joystick's fire button
  2918.         bne    _not_down
  2919.         bset    #FIRE,d0
  2920. _not_down    movem.l    (SP)+,d7/a0
  2921.         rts
  2922. ;---------------------------------------
  2923. ; D1 is WORD range ; returns in D0
  2924.  
  2925. rnd        move.l    a0,-(SP)
  2926.         tst.w    d1        ;If param <> 0
  2927.         beq    _zero_range
  2928.         lea    _rndseed,a0    ;Get address of seed
  2929.         move.l    (a0),d0        ;Get seed
  2930.         rol.l    d0,d0        ;mix bits
  2931.         swap    d0    
  2932.         add.l    CUSTOM_BASE+vposr,d0
  2933.         eori.l    #$1DA72BD5,D0
  2934.         move.l    d0,(a0)        ;Save new seed
  2935.         clrh    d0        ;make sure no Overflow occurs
  2936.         divu    d1,d0        ;Divide by range
  2937.         swap    d0        ;and get remainder (modulus)
  2938. quit_rnd    move.l    (SP)+,a0
  2939.         rts
  2940. _zero_range    moveq    #0,d0        ;if range is 0 avoid division by 0
  2941.         bra    quit_rnd
  2942.  
  2943. _rndseed    dc.l    $1A39F5D6
  2944.  
  2945. ;---------------------------------------
  2946. ; A0 -> string dest
  2947. ; D0 = # to be cvtd (LONG)
  2948. ; D1 = # of chars wanted
  2949.  
  2950. bin_to_dec    subq.w    #8,d1
  2951.         neg.w    d1
  2952.         add.w    d1,d1
  2953.         add.w    d1,d1
  2954.         lea    powers(PC,d1),a1
  2955. next_pow    move.l    (a1)+,d1
  2956.         moveq    #0,d2
  2957. weigh        sub.l    d1,d0
  2958.         bcs.s    gotya
  2959.         addq.w    #1,d2
  2960.         bra    weigh
  2961. gotya        add.l    d1,d0
  2962.         add.b    #'0',d2
  2963.         move.b    d2,(a0)+
  2964.         subq.l    #1,d1
  2965.         bne    next_pow
  2966.         rts
  2967.  
  2968. powers        dc.l    10000000    7
  2969.         dc.l    1000000        6
  2970.         dc.l    100000        5
  2971.         dc.l    10000        4
  2972.         dc.l    1000        3
  2973.         dc.l    100        2
  2974.         dc.l    10        1
  2975.         dc.l    1        0
  2976. ;---------------------------------------
  2977. delay        subq.l    #1,d0
  2978.         bne    delay
  2979. dummy        rts
  2980. ;---------------------------------------
  2981. HANG        move.w    #YELLOW,COLOR_BASE
  2982.         move.w    #GREY,COLOR_BASE
  2983.         bra    HANG
  2984. ;---------------------------------------
  2985. source_maps:    INCBIN    "maps"
  2986.  
  2987. ;            *********
  2988. ;            CONSTANTS 
  2989. ;            *********
  2990.  
  2991. rocky_screendef    dc.w    0,0
  2992.         dc.w    320
  2993.         dc.w    200
  2994.         dc.w    PLANES
  2995.         dc.b    2,1
  2996.         dc.w    0            ;screen modes
  2997.         dc.w    CUSTOMSCREEN
  2998.         dc.l    0
  2999.         dc.l    screen_name
  3000.         dc.l    0
  3001.         dc.l    0
  3002.  
  3003. windowdef    dc.w    0,20
  3004.         dc.w    320,160
  3005.         dc.b    2,1
  3006.         dc.l    WINDOW_IDCMP
  3007.         dc.l    WINDOW_FLAGS
  3008.         dc.l    0        ;gadget list
  3009.         dc.l    0        ;std checkmark
  3010.         dc.l    0        ;no name !!
  3011. window_screen    dc.l    0
  3012.         dc.l    0        ;no custom BitMap
  3013.         dc.w    50,50,320,200    ;mins & maxs
  3014.         dc.w    CUSTOMSCREEN
  3015.  
  3016. screen_name    dc.b    'Rocky Clone V1.0',0
  3017.         dc.b    '© written by Laurence Vanhelsuwé.'
  3018.  
  3019. ;-----------------------STRINGS
  3020. dos_name    DOSNAME
  3021. gfx_name    GRAFNAME
  3022. intui_name    INTNAME
  3023.  
  3024. score_string    dc.b    'POINTS '
  3025. score_field    dc.b    '000000',0
  3026.  
  3027. level_string    dc.b    'LEVEL '
  3028. level_num    dc.b    'XX'
  3029.  
  3030. time_string
  3031. diam_string    dc.b    'XXX',0
  3032.  
  3033. ;-----------------------FILE NAMES
  3034. fname0        dc.b    'chars',0
  3035.  
  3036. jewel_name    dc.b    'GEMS'
  3037. ;-----------------------
  3038. bonus_scores    dc.l    20000,60000,120000,240000,950000
  3039.  
  3040. screen_colors    dc.w    $000,$fdb,$b00,$080,$24c,$eb0,$b52,$f0f
  3041.  
  3042. world_descriptors
  3043.     dc.l    80,70,90,30            ;normal points
  3044.     dc.l    100,90,35,35            ;greedy points
  3045.     dc.w    40,40,80,100            ;to collect
  3046.     dc.w    110,110,130,110            ;time left
  3047.  
  3048.     dc.l    110,25,20,55,140,40,30,75
  3049.     dc.w    20,65,130,55
  3050.     dc.w    80,140,100,110
  3051.  
  3052.     dc.l    60,95,45,45,80,50,50,50
  3053.     dc.w    50,35,25,45
  3054.     dc.w    110,110,90,130
  3055.  
  3056.     dc.l    120,70,80,45,150,90,50,50
  3057.     dc.w    16,35,30,30
  3058.     dc.w    90,100,110,140
  3059.  
  3060.     dc.l    45,45,45,45,50,50,50,50
  3061.     dc.w    30,125,22,35
  3062.     dc.w    110,145,120,140
  3063.  
  3064.     dc.l    40,45,45,45,55,100,50,50
  3065.     dc.w    50,30,30,30
  3066.     dc.w    130,90,110,140
  3067.  
  3068.     dc.l    45,45,45,45,50,50,50,50
  3069.     dc.w    26,55,60,60
  3070.     dc.w    110,110,140,110
  3071.  
  3072.     dc.l    45,45,45,45,50,50,50,50
  3073.     dc.w    20,8,40,20
  3074.     dc.w    140,140,140,160
  3075.  
  3076.     dc.l    45,45,45,45,50,50,50,50
  3077.     dc.w    12,70,75,18
  3078.     dc.w    130,180,65,140
  3079.  
  3080.     dc.l    45,45,45,45,50,50,50,50
  3081.     dc.w    18,20,60,30
  3082.     dc.w    140,140,140,140
  3083.  
  3084. ;-----------------------The Maps
  3085. no_mans_land    ds.b    COLUMNS+1
  3086.         EVEN
  3087. cell_map    ds.b    MAP_SIZE
  3088. flag_map    ds.b    MAP_SIZE    ;used to hold TO DO/DONE flag
  3089. ;---------------------------------------------------------------------
  3090. ;        ****************
  3091. ;        VARIABLES & PTRS
  3092. ;        ****************
  3093.  
  3094. DOS_LIB_PTR    ds.l    1
  3095. GFX_LIB_PTR    ds.l    1
  3096. INTUI_LIB_PTR    ds.l    1
  3097.  
  3098. stack_level    ds.l    1
  3099.  
  3100. mymsgport    ds.l    1
  3101. waitmask    ds.l    1
  3102. imsg_class    ds.l    1
  3103. imsg_code    ds.w    1
  3104. imsg_addr    ds.l    1
  3105. imsg_ratcords    ds.l    1
  3106.  
  3107. myscreen    ds.l    1
  3108. mywindow    ds.l    1
  3109. myviewport    ds.l    1
  3110. myrastport    ds.l    1
  3111. mybitmap    ds.l    1
  3112.  
  3113. ;-----------------------
  3114. ;---------STRUCTURES
  3115.         EVEN
  3116. gsnake_struct    ds.b    SNAKE_sizeof
  3117. bsnake_struct    ds.b    SNAKE_sizeof
  3118.  
  3119. ;-----------------------
  3120. ;---------LONGS
  3121. maps        ds.l    1    ;points to 1 map
  3122. plane_ptrs    ds.l    1
  3123. screen_base    ds.l    3
  3124. char_graphics    ds.l    1
  3125. divu_table    ds.l    1
  3126.  
  3127. ;-- 'current level' vars
  3128. world_ptr    ds.l    1
  3129. price        ds.l    1
  3130. score        ds.l    1
  3131. time        ds.l    1    ;intuition seconds counter
  3132. ;---------WORDS
  3133. anim_clock    ds.w    1
  3134. time_left    ds.w    1
  3135. magic_timer    ds.w    1
  3136. gegg_timer    ds.w    1
  3137. begg_timer    ds.w    1
  3138.  
  3139. rf_x        ds.w    1
  3140. rf_y        ds.w    1
  3141. joystick    ds.w    1
  3142.  
  3143. world        ds.w    1
  3144. level        ds.w    1
  3145.  
  3146. amiba_count    ds.w    1
  3147. diamonds    ds.w    1
  3148. scan_count    ds.w    1
  3149. target        ds.w    1
  3150. lives        ds.w    1
  3151. next_bonus    ds.w    1
  3152.  
  3153. ;---------BYTES
  3154. keyval        ds.b    1    ;-1 for no key
  3155. energy        ds.b    1
  3156. flash        ds.b    1
  3157. death_count    ds.b    1
  3158. neighbours    ds.b    1
  3159.  
  3160. ; FLAGS        $FF = TRUE // $00 = FALSE
  3161. ;------
  3162. rockf_died    ds.b    1
  3163. die_anyway    ds.b    1
  3164. out_of_time    ds.b    1    ;the three EXIT conditions
  3165. found_exit    ds.b    1
  3166.  
  3167. added_amiba    ds.b    1
  3168. magic_walls    ds.b    1
  3169. enough_diamonds    ds.b    1
  3170. fire_taps_on    ds.b    1
  3171. water_taps_on    ds.b    1
  3172. disable_rockf    ds.b    1
  3173. cleared        ds.b    1    ;cell_buffer cleared
  3174. first_time    ds.b    1
  3175. one_two        ds.b    1
  3176.  
  3177. good_snake    ds.b    1
  3178. bad_snake    ds.b    1
  3179.  
  3180. pauze        ds.b    1
  3181. debounce    ds.b    1
  3182. key_move    ds.b    1    ;keyboard generated simulated joystick move
  3183. bonk        ds.b    1    ;rock fell
  3184. ping        ds.b    1
  3185. freeze_rf    ds.b    1
  3186.  
  3187.         END
  3188.